在Windows上的Cmake中为Debug和Release构建链接不同的库?

时间:2010-02-05 19:47:30

标签: c++ windows cmake

所以我有一个我正在编译的库,我需要链接不同的第三方内容,具体取决于它是调试版还是发布版(特别是这些库的发行版或调试版)。在Cmake中有一种简单的方法吗?

编辑:我应该注意我正在使用visual studio

4 个答案:

答案 0 :(得分:79)

根据CMake documentation

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)

我想为以前的答案添加一些注释。

如果需要创建要链接的多个文件的列表并将其存储在缓存变量中,则需要在每个库之前添加指定的optimizeddebug。这对于较大的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.libC:\boost\lib\Debug\libfoo.lib