为何CMake主脚本设置CMAKE_BUILD_TYPE不生效,CLI方式却可行?
CMake FetchContent子模块构建类型设置不生效的问题解决
我在CMake中通过FetchContent引入Logger模块,代码如下:
FetchContent_Declare( Logger GIT_REPOSITORY https://github.com/fehimkus/MessageLogger.git GIT_TAG main ) FetchContent_MakeAvailable(Logger)
为了让Logger以Release模式构建,我在主CMake脚本里添加了:
set(CMAKE_BUILD_TYPE Release)
但实际构建时,Logger依然是Debug模式。而通过CLI执行以下命令,就能让Logger正常以Release模式构建:
mkdir -p build && cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF
问题原因
CMake的CMAKE_BUILD_TYPE变量需要在FetchContent处理子模块之前设置。如果把set(CMAKE_BUILD_TYPE Release)写在FetchContent_MakeAvailable之后,子模块在配置时还没读取到这个变量的修改,会默认使用Debug模式构建。而通过CLI传递-DCMAKE_BUILD_TYPE=Release时,这个变量在CMake初始化阶段就被设置,所有后续处理的子模块都会继承这个值。
解决方案
将构建类型的设置代码移到引入子模块的代码之前,修改后的脚本如下:
# 先全局设置构建类型 set(CMAKE_BUILD_TYPE Release) # 再引入并初始化Logger子模块 FetchContent_Declare( Logger GIT_REPOSITORY https://github.com/fehimkus/MessageLogger.git GIT_TAG main ) FetchContent_MakeAvailable(Logger)
@Tsyvarev提供的这个解决方案是正确的,核心就是保证全局构建类型变量在子模块配置前完成设置,这样子模块才能继承指定的构建类型。
内容的提问来源于stack exchange,提问作者fehim kus
相关产品推荐
相关产品推荐

