如何让FetchContent始终以Release模式构建Catch2库
强制FetchContent获取的Catch2始终以Release模式构建
要实现不管主项目的构建类型是什么,都让Catch2以Release模式编译,可以通过手动控制FetchContent的初始化流程,在配置Catch2前临时覆盖构建类型变量,完成配置后恢复主项目的原始设置。
修改后的CMake代码如下:
Include(FetchContent) FetchContent_Declare( Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_TAG v3.4.0 ) # 保存主项目原本的构建类型 set(ORIGINAL_BUILD_TYPE "${CMAKE_BUILD_TYPE}") FetchContent_GetProperties(Catch2) if(NOT Catch2_POPULATED) FetchContent_Populate(Catch2) # 强制设置Catch2的构建类型为Release set(CMAKE_BUILD_TYPE "Release" CACHE INTERNAL "" FORCE) # 添加Catch2子项目 add_subdirectory(${Catch2_SOURCE_DIR} ${Catch2_BINARY_DIR}) # 恢复主项目的构建类型 set(CMAKE_BUILD_TYPE "${ORIGINAL_BUILD_TYPE}" CACHE INTERNAL "" FORCE) endif()
关键说明:
- 用
FetchContent_GetProperties检查Catch2是否已初始化,避免重复执行流程 - 先保存主项目的
CMAKE_BUILD_TYPE,防止修改后影响主项目编译 - 在
add_subdirectory前强制将构建类型设为Release,确保Catch2以Release模式编译 - 完成Catch2配置后立即恢复主项目的原始构建类型
如果你的项目使用多配置生成器(比如Visual Studio、Xcode),CMAKE_BUILD_TYPE不会生效,此时可以通过限制Catch2的配置类型为Release实现需求:
Include(FetchContent) FetchContent_Declare( Catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_TAG v3.4.0 ) FetchContent_GetProperties(Catch2) if(NOT Catch2_POPULATED) FetchContent_Populate(Catch2) # 强制Catch2只生成Release配置 set(CMAKE_CONFIGURATION_TYPES "Release" CACHE INTERNAL "" FORCE) add_subdirectory(${Catch2_SOURCE_DIR} ${Catch2_BINARY_DIR}) endif()
这种方式会让多配置生成器仅为Catch2生成Release版本的构建目标,主项目仍可正常选择Debug/Release等配置。
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

