2011-01-30 8 views
25

Il titolo lo copre principalmente, qual è la differenza tra un modulo e una libreria condivisa? Ho appena trovato questa distinzione al comando di CMake add_library, dove dicono:Differenza tra moduli e librerie condivise?

librerie condivise sono collegate in modo dinamico e caricati in fase di esecuzione. Le librerie MODULE sono plug-in che non sono collegati ad altre destinazioni ma possono essere caricate dinamicamente in fase di runtime utilizzando la funzionalità simile a dlopen.

Ma posso caricare un oggetto condiviso utilizzando dlopen(), no?

risposta

22

La differenza è che è possibile collegare a una libreria SHARED con il linker, ma non è possibile collegarsi a un MODULO con il linker. Su alcune piattaforme.

Quindi ... per essere completamente cross-platform e lavorare ovunque funziona CMake, non si dovrebbe mai fare questo:

# This is a big NO-NO: 
add_library(mylib MODULE ${srcs}) 
target_link_libraries(myexe mylib) 

Per essere onesti, su Windows, sono entrambi solo DLL, e quindi questo il codice potrebbe effettivamente funzionare. Ma quando lo porti su una piattaforma dove è impossibile collegarsi al MODULO, incontrerai un errore.

In conclusione: se è necessario collegarsi alla libreria, utilizzare SHARED. Se si è sicuri che la libreria sarà solo caricata dinamicamente, allora è sicuro usare un MODULO. (E forse anche preferibile per contribuire a rilevare se qualcuno fa cercare di collegare ad esso ...)

+0

Qualcuno sa su quali piattaforme questo potrebbe essere un problema? – mhsmith

5

Penso che la distinzione che viene fatta è che le librerie condivise sono specificate dallo sviluppatore in fase di compilazione e devono essere presenti per l'esecuzione dell'applicazione, anche se i loro metodi sono caricati in fase di esecuzione. Un modulo, cioè il plugin, aggiunge ulteriore supporto in fase di esecuzione ma non è richiesto. Sì, puoi dlopen() una libreria condivisa, ma in quel caso non sarebbe stata specificata come parte richiesta del programma e funzionerà come un modulo.

1

Un'altra differenza è nel modo in cui ..._OUTPUT_DIRECTORY e ..._OUTPUT_NAME sono curati:

librerie moduli vengono sempre trattati come biblioteca obiettivi. Per le piattaforme non DLL le librerie condivise sono considerate come target di libreria. Per le piattaforme DLL, la parte DLL di una libreria condivisa viene considerata come destinazione di runtime e la libreria di importazione corrispondente viene considerata come destinazione dell'archivio. Tutti i sistemi basati su Windows, tra cui Cygwin, sono piattaforme DLL.

Ad esempio, questo significa che se si compila una libreria SHARED su Windows, verrà ignorato LIBRARY_OUTPUT_DIRECTORY, perché è guardando ARCHIVE_OUTPUT_DIRECTORY e RUNTIME_OUTPUT_DIRECTORY invece.