Связывать разные библиотеки для сборок 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 в зависимости от выбранной конфигурации.

Другие вопросы по тегам