Conan 2.x中使用build_requirements时如何让CMakeDeps生成对应依赖的.cmake配置文件?
Conan 2.x中使用build_requirements时如何让CMakeDeps生成对应依赖的.cmake配置文件?
这个问题我之前帮同事排查过,Conan 2.x对构建依赖(build_requirements)和运行时依赖(requirements)的生成器处理逻辑是不一样的,我来给你拆解原因和解决办法:
为什么默认不生成.cmake文件?
在Conan 2里,tool_requires 默认被归类为纯构建工具(比如cmake、ninja这类),这类依赖不需要暴露给你的项目CMake配置,所以CMakeDeps生成器默认不会为它们生成对应的Config.cmake文件。而之前的requires是运行时依赖,CMakeDeps会自动为其生成配置文件供find_package使用。
但像grpc、protobuf这类依赖,虽然你把它们放到了构建依赖里,但项目CMake脚本里依然需要通过find_package来调用它们的工具或链接库,这时候就需要显式告诉Conan:要为这些构建依赖生成CMake配置文件。
解决办法:给tool_requires添加generate=True参数
在你的build_requirements函数里,给需要生成配置文件的依赖加上generate=True选项,这样Conan就会触发CMakeDeps为这些包生成对应的.cmake配置文件。修改后的代码如下:
# Build level requirements def build_requirements(self): print("[conanfily.py]: Defining build requirements") # 给需要find_package的依赖添加generate=True self.tool_requires("grpc/1.54.3", generate=True) self.tool_requires("protobuf/3.21.12", generate=True) # cmake作为纯构建工具,不需要生成配置文件,不用加 self.tool_requires("cmake/3.28.1")
验证步骤
- 删掉之前生成的Conan缓存和构建目录,避免残留配置干扰
- 重新运行
conan install命令 - 检查生成的CMake配置目录(通常是
conan_install下的cmake文件夹),你会看到gRPCConfig.cmake、protobuf-config.cmake这些文件已经生成了 - 再次执行CMake构建,
find_package就能正常找到依赖了
额外提示
如果你的项目里还有其他需要在CMake中引用的构建依赖,都需要给对应的tool_requires加上generate=True。而像cmake、ninja这类纯构建工具,完全不需要在CMake里find_package,就不用加这个参数,保持默认即可。
备注:内容来源于stack exchange,提问作者Loop
相关产品推荐
相关产品推荐

