如何在CMakeLists.txt中判断Visual Studio当前构建类型
解决Visual Studio多配置生成器下CMAKE_BUILD_TYPE无效的问题
问题场景
你的构建命令为:
cmake --build . --config Debug
其中Debug可替换为Release或使用默认配置。原CMakeLists.txt代码如下:
if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_link_libraries(${PROJECT_NAME} PRIVATE LLUd wstp64i4) else() target_link_libraries(${PROJECT_NAME} PRIVATE LLU wstp64i4) endif()
由于Visual Studio属于多配置生成器,CMAKE_BUILD_TYPE变量无法被正确识别,导致上述条件判断失效。
修改方案
多配置生成器需要使用CMake的生成器表达式来针对不同配置做差异化处理,推荐两种简洁的写法:
写法一:用NOT表达式简化判断
target_link_libraries(${PROJECT_NAME} PRIVATE # Debug配置链接LLUd,其他配置链接LLU $<$<CONFIG:Debug>:LLUd> $<$<NOT:$<CONFIG:Debug>>:LLU> # 所有配置都需要链接的库 wstp64i4 )
写法二:显式指定各配置对应的库
如果需要区分更多配置(如RelWithDebInfo、MinSizeRel),可以逐个声明:
target_link_libraries(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:LLUd> $<$<CONFIG:Release>:LLU> $<$<CONFIG:RelWithDebInfo>:LLU> $<$<CONFIG:MinSizeRel>:LLU> wstp64i4 )
原理说明
多配置生成器(如Visual Studio、Xcode)会在构建阶段才确定具体使用的配置(Debug/Release等),而CMAKE_BUILD_TYPE是给单配置生成器(如Makefile、Ninja)使用的,在多配置环境下该变量不会被CMake正确赋值。生成器表达式会在CMake生成构建文件时,针对不同配置自动展开对应的内容,完美适配多配置场景。
内容的提问来源于stack exchange,提问作者yode
相关产品推荐
相关产品推荐

