web-dev-qa-db-fra.com

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

Je compile donc une bibliothèque et je dois relier différents éléments tiers en fonction de la version de débogage ou de version (en particulier de la version ou des versions de débogage de ces bibliothèques). Y at-il un moyen facile de faire cela dans Cmake?

Edit: je dois noter que j'utilise Visual Studio

45
Sean McAllister

Selon la documentation CMake :

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

"Debug", "optimisé" ou "général" mot-clé indique que la bibliothèque immédiatement après, il doit être utilisé seulement pour la construction correspondante configuration.

Donc, vous devriez pouvoir faire ceci:

add_executable( MyEXE ${SOURCES})

target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)
78
Mike Willekes

D'une manière ou d'une autre, la réponse de @Mike Willekes a obtenu pour CMake un lien dans la même cible les deux versions et le débogage pour moi :(

Cela fonctionne uniquement en plaçant les deux configurations sur une seule ligne, comme suggéré par @sakra dans une question connexe -, et ce, pour chaque bibliothèque devant ê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} )

# ...
11
Tarc

J'aimerais ajouter quelques notes aux réponses précédentes.

Si vous devez créer une liste de plusieurs fichiers que vous souhaitez lier et stocker dans une variable de cache, vous devez ajouter les variables optimized ou debug spécifiées avant chaque bibliothèque. Cela peut être particulièrement utile pour les plus grands makefiles/projets.

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} )
0
akaltar