Связывать разные библиотеки для сборок Debug и Release в Cmake на Windows?
Итак, у меня есть библиотека, которую я компилирую, и мне нужно связать различные сторонние компоненты в зависимости от того, является ли это отладкой или сборкой релиза (в частности, релизной или отладочной версией этих библиотек). Есть ли простой способ сделать это в Cmake?
Изменить: я должен отметить, что я использую Visual Studio
5 ответов
Согласно документации 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)
Каким-то образом ответ от @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} )
# ...
Я хотел бы добавить несколько примечаний к предыдущим ответам.
Если вам нужно создать список из нескольких файлов, которые вы хотите связать, и сохранить их в переменной кэша, тогда вам нужно добавить 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} )
target_link_libraries
сoptimize
иdebug
не работает для меня. Я следую за сообщением Майка Виллекеса, но конфигурация выпуска также импортирует файл библиотеки отладки в Visual Studio. Затем я использую следующий код cmake для решения этой проблемы.
add_library(BoostLib STATIC IMPORTED)
set_target_properties(BoostLib PROPERTIES
IMPORTED_LOCATION_DEBUG ${BoostLibPath}/debug/module1.lib
IMPORTED_LOCATION_RELEASE ${BoostLibPath}/release/module1.lib)
target_link_libraries(AppTarget BoostLib)
То, что работало для меня, было использовать $(Configuration)
макрос в пути lib, предоставленном cmake.
Итак, предположим, что библиотеки хранятся в отдельных папках с правильными именами, например:
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
в зависимости от выбранной конфигурации.