所以我有一个我正在编译的库,我需要链接不同的第三方内容,具体取决于它是调试版还是发布版(特别是这些库的发行版或调试版)。在Cmake中有一种简单的方法吗?
编辑:我应该注意我正在使用visual studio
答案 0 :(得分:79)
target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...)
“调试”,“优化”或“一般” 关键字表示该库 紧随其后就可以使用了 仅适用于相应的构建 配置。
所以你应该能够做到这一点:
add_executable( MyEXE ${SOURCES})
target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)
答案 1 :(得分:12)
不知怎的,来自@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} )
# ...
答案 2 :(得分:1)
我想为以前的答案添加一些注释。
如果需要创建要链接的多个文件的列表并将其存储在缓存变量中,则需要在每个库之前添加指定的optimized
或debug
。这对于较大的makefile /项目尤其有用。
例如,您可以执行以下操作:
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} )
答案 3 :(得分:0)
对我有用的是在提供给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
。