CMake打包的头文件库制作Conan 2包时Boost依赖无法识别
问题背景
你正在将自带arg_router.cmake、arg_router-config.cmake和arg_router-config-version.cmake的头文件库打包为Conan v2包,该库依赖Boost头文件。在Conan环境外构建消费项目正常,但使用Conan生成的工具链文件时,CMake调用find_package()查找Boost失败,错误提示缺少Boost_INCLUDE_DIR,且conan_toolchain.cmake中未包含Conan安装的Boost路径。
你的conanfile.py中已声明Boost依赖,包也成功创建安装,但构建时出现如下错误:
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find Boost (missing: Boost_INCLUDE_DIR) (Required is at least version "1.74") Call Stack (most recent call first): /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE) /usr/share/cmake-3.22/Modules/FindBoost.cmake:2360 (find_package_handle_standard_args) /usr/share/cmake-3.22/Modules/CMakeFindDependencyMacro.cmake:47 (find_package) /home/cmannett85/.conan2/p/arg_r7889c12afa496/p/share/arg_router/arg_router-config.cmake:32 (find_dependency) CMakeLists.txt:11 (find_package)
核心原因
问题出在package_info中的cmake_find_mode设置:
self.cpp_info.set_property("cmake_find_mode", "none")
当设置为none时,Conan会完全放弃对该包的CMake查找逻辑处理,不会将该包的依赖(如Boost)的CMake配置路径注入到消费项目的CMake环境中。
你的arg_router-config.cmake中使用find_dependency(Boost)查找依赖,但此时CMake只能通过系统默认的FindBoost.cmake模块查找,而该模块不知道Conan安装的Boost路径,因此查找失败。
解决方案
修改conanfile.py的package_info部分,将cmake_find_mode设置为config(适配你的包自带的Config格式CMake文件):
def package_info(self): self.cpp_info.builddirs.append(os.path.join("share", "arg_router")) # 使用config模式,适配自带的Config CMake文件 self.cpp_info.set_property("cmake_find_mode", "config")
或者直接移除cmake_find_mode的设置,Conan会根据包的类型自动选择合适的模式(对于自带Config文件的包,默认就是config模式)。
原理说明
当cmake_find_mode设为config时:
- Conan会识别到你的包自带Config文件,同时自动将该包的依赖(Boost)的CMake配置路径添加到消费项目的
CMAKE_PREFIX_PATH中; - CMake执行
find_dependency(Boost)时,会优先找到Conan生成的BoostConfig.cmake文件,从而获取正确的Boost头文件路径; - 依赖的传递配置会被Conan正确处理,无需手动修改工具链文件。
额外验证
修改后重新打包安装arg_router,再构建测试项目:
- 检查
conan_toolchain.cmake,会看到Boost的配置路径被添加到CMAKE_PREFIX_PATH中; - CMake执行
find_package(arg_router)时,会通过arg_router-config.cmake找到Conan安装的Boost,不再依赖系统的FindBoost模块。
内容的提问来源于stack exchange,提问作者cmannett85

