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

gct*_*gct 50 c++ windows cmake

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

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

Mik*_*kes 82

根据CMake文档:

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...)
Run Code Online (Sandbox Code Playgroud)

"debug","optimized"或"general"关键字表示紧随其后的库仅用于相应的构建配置.

所以你应该能够做到这一点:

add_executable( MyEXE ${SOURCES})

target_link_libraries( MyEXE debug 3PDebugLib)
target_link_libraries( MyEXE optimized 3PReleaseLib)
Run Code Online (Sandbox Code Playgroud)

  • 您不应该在CMake文件中测试CMAKE_BUILD_TYPE,它会被多配置生成器(如VS)忽略.如果使用CMAKE_BUILD_TYPE = Debug运行cmake但在VS中释放,则`if(CMAKE_BUILD_TYPE MATCHES Release)`中的代码无效. (19认同)
  • 我一直这样做,甚至更紧凑地在一行:target_link_libraries(MyEXE debug 3PDebugLib优化3PReleaseLib) (16认同)
  • 如果库名相同,但您希望visual studio在不同的路径中查找它,该怎么办?即我想链接mylib.lib但我有两个版本的编译.一个位于/path/Debug/mylib.lib下,另一个位于/path/Release/mylib.lib下(某些库通常就是这种情况).那你怎么办呢? (11认同)
  • 在我的项目中尝试上面的时候,它正在添加debug*和*release libs ... (5认同)
  • 如果您想要像VS 2010中那样"发布",那么您需要为target_link_libraries指定"发布"而不是"优化".请注意,这是区分大小写的.你也可以检查你的cmake中的"Release":`IF(CMAKE_BUILD_TYPE MATCHES Release)`再次区分大小写. (3认同)
  • @Jubei 定义 2 个变量。每个图书馆一个。 (2认同)

Tar*_*arc 13

不知怎的,来自@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} )

# ...
Run Code Online (Sandbox Code Playgroud)


aka*_*tar 5

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

如果您需要创建要链接的多个文件的列表并将其存储在缓存变量中,那么您需要在每个库之前添加optimizeddebug指定。这对于较大的生成文件/项目特别有用。

例如,您可以执行以下操作:

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} )
Run Code Online (Sandbox Code Playgroud)