186 votes

Est-il possible de faire en sorte que CMake construise à la fois une version statique et une version partagée de la même bibliothèque?

Même source, tout cela, je veux juste une version statique et partagée à la fois. Facile à faire?

149voto

Christopher Bruns Points 3114

Oui, c'est assez facile. Utiliser deux "add_library" des commandes:

add_library(MyLib SHARED source1.c source2.c)
add_library(MyLibStatic STATIC source1.c source2.c)

Même si vous disposez de plusieurs fichiers source, vous devez placer la liste des sources dans un cmake variable, il est donc toujours facile à faire.

Sur Windows, vous devez sans doute donner à chaque bibliothèque un nom différent, car il y a un ".lib" fichier partagé et statique. Mais sur Linux et Mac, vous pouvez même donner à la fois des bibliothèques le même nom (par exemple, libMyLib.un et libMyLib.donc):

set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)

Mais je ne recommande pas de donner à la fois statique et dynamique des versions de la bibliothèque du même nom. Je préfère utiliser des noms différents parce que cela rend plus facile de choisir statique vs dynamique de liaison sur la ligne de compilation pour les outils que le lien vers la bibliothèque. Habituellement, je choisis des noms comme libMyLib.(partagée) et libMyLib_static.un (statique). (Ceux qui seraient les noms sur linux.)

31voto

Il n’est généralement pas nécessaire de dupliquer les appels ADD_LIBRARY à cette fin. Juste utiliser

 $> man cmake | grep -A6 '^ *BUILD_SHARED_LIBS$' 
   BUILD_SHARED_LIBS
          Global flag to cause add_library to create shared libraries if on.

          If present and true, this will cause all libraries to be built shared unless the library was
          explicitly added as a static library.  This variable is often added to projects as an OPTION
          so  that each user of a project can decide if they want to build the project using shared or
          static libraries.
 

en construisant d'abord (dans un répertoire hors source) avec -DBUILD_SHARED_LIBS: BOOL = ON et avec OFF dans l'autre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X