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 in a related question 所建议的那样,我只能通过在一行中设置两个配置来实现这一点 - 并对需要链接的每个库都这样做:
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} )
# ...
if (CMAKE_BUILD_TYPE STREQUAL "Release") target_link_libraries(${ARG_NAME} ${LIB_TCMALLOC} ) endif()
debug
关键字对应于 Debug 配置 (...)。optimized
关键字对应于所有其他配置。” (cmake.org/cmake/help/v3.0/command/target_link_libraries.html) 关于多配置生成器,我所说的是,只有当您在两个单独的目录中生成项目时,您所做的检查才会起作用,一个用于发布,另一个用于调试。在 MSVC 构建中,有时只有一个生成的目录具有发布和调试构建的可能性是有意义的。
optimized
用于 tcmalloc 库,它最终出现在我们的调试版本中。虽然我们使用makefile......所以不确定VS
我想在前面的答案中添加一些注释。
如果您需要创建要链接的多个文件的列表并将其存储在缓存变量中,则需要在每个库之前添加指定的 optimized
或 debug
。这对于较大的生成文件/项目特别有用。
因此,例如,您可以执行以下操作:
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} )
对我有用的是在提供给 cmake 的 lib 路径中使用 $(Configuration)
宏。
因此,假设库存储在单独的、正确命名的文件夹中,例如:
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
的内容。
IF(CMAKE_BUILD_TYPE MATCHES Release)
再次区分大小写。if(CMAKE_BUILD_TYPE MATCHES Release)
中的代码根本无效。