72 votes

Lier des bibliothèques différentes pour les builds Debug et Release dans Cmake sous Windows ?

J'ai donc une bibliothèque que je compile et je dois lier différents éléments tiers selon qu'il s'agit de la version de débogage ou de la version finale (plus précisément les versions de débogage ou de version finale de ces bibliothèques). Y a-t-il un moyen facile de faire cela dans Cmake ?

Edit : Je dois noter que j'utilise visual studio

103voto

Mike Willekes Points 2110

Selon le Documentation CMake :

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...)

Un mot clé "débogage", "optimisé" ou "général". mot-clé qui le suit immédiatement doit être utilisée uniquement pour la configuration de construction correspondante.

Vous devriez donc être en mesure de le faire :

add_executable( MyEXE ${SOURCES})

target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)

17 votes

Je fais cela tout le temps, même de manière plus compacte sur une seule ligne : target_link_libraries(MyEXE debug 3PDebugLib optimized 3PReleaseLib)

15 votes

Que se passe-t-il si le nom de la bibliothèque est le même, mais que vous voulez que Visual Studio la cherche dans un chemin différent ? Par exemple, je veux lier malib.lib mais j'ai deux versions de celle-ci compilées. Une sous /path/Debug/mylib.lib et une autre sous /path/Release/mylib.lib (comme c'est souvent le cas avec certaines bibliothèques). Que faites-vous alors ?

2 votes

@Jubei Définissez 2 variables. Une pour chaque bibliothèque.

18voto

Tarc Points 318

D'une manière ou d'une autre, la réponse de @Mike Willekes a permis de lier CMake à la même cible. version et débogage pour moi :(

Je n'ai obtenu ce résultat qu'en définissant les deux configurations sur une seule ligne, comme suggéré par @sakra. dans une question connexe - et de le faire pour chaque bibliothèque qui devait être liée :

target_link_libraries ( app
    debug ${Boost_FILESYSTEM_LIBRARY_DEBUG}
    optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE} )

target_link_libraries ( app
    debug ${Boost_LOG_LIBRARY_DEBUG}
    optimized ${Boost_LOG_LIBRARY_RELEASE} )

target_link_libraries ( app
    debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG}
    optimized ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE} )

# ...

8voto

akaltar Points 370

Je voudrais ajouter quelques remarques aux réponses précédentes.

Si vous avez besoin de créer une liste de plusieurs fichiers que vous souhaitez lier et de la stocker dans une variable de cache, vous devez ajouter l'option optimized o debug spécifié avant chaque bibliothèque. Ceci peut être particulièrement utile pour les makefiles/projets de grande taille.

Ainsi, par exemple, vous pourriez faire quelque chose comme ceci :

set( MyFavLib_LIBRARIES 
    debug debug/module1.lib optimized release/module1.lib
    debug debug/module2.lib optimized release/module2.lib )
target_link_libraries( app ${MyFavLib_LIBRARIES} )

1voto

Konrad Points 157

Ce qui a marché pour moi, c'est d'utiliser $(Configuration) dans un chemin de librairie fourni à cmake.

Donc, en supposant que les librairies sont stockées dans des dossiers séparés et correctement nommés, par exemple :

C:\boost\lib\Debug\libfoo.lib
C:\boost\lib\Release\libfoo.lib

Vous pouvez alors appeler cmake avec :

cmake -G "Visual Studio 10 2010" -DBOOST_LIBRARYDIR=C:\boost\lib\$(Configuration)\libfoo.lib

Cela va générer un fichier .vcxproj avec des dépendances additionnelles incluant C:\boost\lib\$(Configuration)\libfoo.lib ce qui est évalué soit à C:\boost\lib\Release\libfoo.lib o C:\boost\lib\Debug\libfoo.lib en fonction d'une configuration choisie.

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