2011-01-30 20 views
25

El título en su mayoría lo cubre, ¿cuál es la diferencia entre un módulo y una biblioteca compartida? Acabo de encontrar esta distinción en la orden de CMake add_library, donde dicen:¿Diferencia entre módulos y bibliotecas compartidas?

bibliotecas compartidas están vinculados dinámicamente y se cargan en tiempo de ejecución. Las bibliotecas de MODULE son complementos que no están vinculados con otros objetivos, pero pueden cargarse dinámicamente en tiempo de ejecución utilizando la funcionalidad dlopen-like.

Pero puedo cargar un objeto compartido usando dlopen(), ¿o no?

Respuesta

22

La diferencia es que puede vincular a una biblioteca COMPARTIDA con el vinculador, pero no puede vincular a un MÓDULO con el vinculador. En algunas plataformas.

Entonces ... para ser totalmente multiplataforma y funciona en todas partes trabajar CMake, nunca se debe hacer esto:

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

Para ser justos, en Windows, los dos son sólo dlls, y por lo que este el código podría funcionar. Pero cuando lo llevas a una plataforma donde es imposible vincularlo al MÓDULO, encontrarás un error.

En pocas palabras: si necesita vincular a la biblioteca, use COMPARTIDO. Si se le garantiza que la biblioteca se solo se cargue dinámicamente, entonces es seguro usar un MÓDULO. (Y tal vez incluso preferible para ayudar a detectar si alguien hace intenta vincular a ella ...)

+0

¿Alguien sabe en qué plataformas esto podría ser un problema? – mhsmith

5

Creo que la distinción que se hace es que las bibliotecas compartidas son especificadas por el desarrollador en tiempo de compilación y deben estar presentes para que la aplicación se ejecute, aunque sus métodos se carguen en tiempo de ejecución. Un módulo, es decir, un complemento, agrega soporte adicional en tiempo de ejecución, pero no es obligatorio. Sí, puede dlopen() una biblioteca compartida, pero en ese caso no se habría especificado como una parte requerida del programa y, en su lugar, funcionaría como un módulo.

1

Otra diferencia está en cómo ..._OUTPUT_DIRECTORY y ..._OUTPUT_NAME se manejan:

bibliotecas módulo se tratan siempre como biblioteca objetivos. Para las plataformas que no son DLL, las bibliotecas compartidas se tratan como objetivos de biblioteca. Para las plataformas DLL, la parte DLL de una biblioteca compartida se trata como un objetivo de tiempo de ejecución y la biblioteca de importación correspondiente se trata como un destino de archivo. Todos los sistemas basados ​​en Windows, incluidos Cygwin, son plataformas DLL.

Por ejemplo, esto significa que si compila una biblioteca SHARED en Windows, LIBRARY_OUTPUT_DIRECTORY será ignorado, ya que está mirando ARCHIVE_OUTPUT_DIRECTORY y RUNTIME_OUTPUT_DIRECTORY lugar.

Cuestiones relacionadas