You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CMake FetchContent引入仅头文件项目且规避构建(非废弃方式)

如何用合规的CMake FetchContent引入仅头文件依赖并跳过构建?

我需要通过FetchContent引入一个仅头文件的C++依赖项目,该项目本身不需要构建,但它自带的CMakeLists.txt会以非标准方式构建测试代码。我希望完全跳过构建步骤,避免生成额外二进制文件,同时消除相关警告。

最初的代码会触发构建:

FetchContent_Declare(
  TheProject
  GIT_REPOSITORY <the git repo>
  GIT_TAG <the git commit>
)
FetchContent_MakeAvailable(TheProject)

改用FetchContent_Populate能解决构建问题,但会收到该函数已废弃的警告:

FetchContent_Declare(
  TheProject
  GIT_REPOSITORY <the git repo>
  GIT_TAG <the git commit>
)
FetchContent_Populate(TheProject)

请问有没有合规的实现方式,既不触发构建,也不使用废弃特性?


解决方案1:利用依赖的CMake开关关闭额外构建(推荐)

如果目标依赖提供了关闭测试/示例等额外构建的CMake选项(比如常见的BUILD_TESTING、BUILD_EXAMPLES),可以在调用FetchContent_MakeAvailable之前强制设置这些选项为OFF,这样依赖的CMakeLists.txt就不会生成多余的二进制文件。

示例代码:

# 强制关闭依赖的测试构建(根据依赖实际的开关名称调整)
set(BUILD_TESTING OFF CACHE BOOL "Disable tests for TheProject" FORCE)
# 如果依赖还有其他不必要的构建开关,一并关闭
set(BUILD_EXAMPLES OFF CACHE BOOL "Disable examples for TheProject" FORCE)

FetchContent_Declare(
  TheProject
  GIT_REPOSITORY <the git repo>
  GIT_TAG <the git commit>
)

FetchContent_MakeAvailable(TheProject)

这种方法完全符合CMake的现代用法,不会触发废弃警告,同时能正常引入头文件依赖。

解决方案2:手动获取源码并集成(无开关时使用)

如果依赖没有提供关闭构建的开关,你可以手动处理源码获取和头文件集成,同时通过CMake设置临时抑制废弃警告:

FetchContent_Declare(
  TheProject
  GIT_REPOSITORY <the git repo>
  GIT_TAG <the git commit>
)

# 检查依赖是否已被获取
FetchContent_GetProperties(TheProject)
if(NOT TheProject_POPULATED)
  # 临时抑制FetchContent_Populate的废弃警告
  set(CMAKE_WARN_DEPRECATED OFF)
  FetchContent_Populate(TheProject)
  # 恢复警告设置
  set(CMAKE_WARN_DEPRECATED ON)
  
  # 将依赖的头文件目录添加到你的目标中(根据实际路径调整)
  target_include_directories(YourTargetName PRIVATE ${TheProject_SOURCE_DIR}/include)
endif()

这种方法避开了依赖的构建流程,直接引入头文件,同时通过临时关闭警告避免了废弃提示。注意替换YourTargetName为你项目中的实际目标名称,以及调整头文件的路径。


内容的提问来源于stack exchange,提问作者rpatters1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:54