Связывать разные библиотеки для сборок Debug и Release в Cmake на Windows? - PullRequest
45 голосов
/ 05 февраля 2010

Итак, у меня есть библиотека, которую я компилирую, и мне нужно связать разные сторонние компоненты в зависимости от того, является ли это отладкой или выпуском сборки (в частности, выпуском или отладкой версий этих библиотек). Есть ли простой способ сделать это в Cmake?

Редактировать: я должен отметить, что я использую Visual Studio

Ответы [ 4 ]

79 голосов
/ 08 февраля 2010

Согласно документации CMake :

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

Ключевое слово "debug", "optimized" или "general" означает, что библиотека, следующая непосредственно за ней, должнаиспользоваться только для соответствующей конфигурации сборки.

Так что вы должны быть в состоянии сделать это:

add_executable( MyEXE ${SOURCES})

target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)
12 голосов
/ 16 августа 2016

Каким-то образом ответ от @Mike Willekes получил связывание CMake в одной и той же цели и выпустить, и отладить для меня: (

Я получил эту работу, только установив обе конфигурации в одну строку, как предложено @sakra в связанном вопросе - и сделал это для каждой библиотеки, которую нужно связать:

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

# ...
1 голос
/ 13 января 2019

Я хотел бы добавить несколько примечаний к предыдущим ответам.

Если вам нужно создать список из нескольких файлов, которые вы хотите связать, и сохранить их в переменной кэша, то вам нужно добавить optimized или debug, указанный перед каждой библиотекой. Это может быть особенно полезно для больших make-файлов / проектов.

Так, например, вы могли бы сделать что-то вроде этого:

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 голосов
/ 12 марта 2019

Для меня работало использование макроса $(Configuration) в пути lib, предоставленном cmake.

Итак, предположим, что библиотеки хранятся в отдельных папках с правильными именами, например ::1004

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

Затем вы можете вызвать cmake с помощью:

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

Это сгенерирует .vcxproj с дополнительными зависимостями, включая C:\boost\lib\$(Configuration)\libfoo.lib, что оценивается как C:\boost\lib\Release\libfoo.lib или C:\boost\lib\Debug\libfoo.lib в зависимости от выбранной конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...