如何用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
相关产品推荐
相关产品推荐

