使用Conan打包CMake项目时提示缺失conanbuild.conf如何解决
问题原因
- Conan API混用:你当前同时使用了Conan 1.x的旧API和2.x风格的新CMake辅助工具,
from conans import ConanFile是Conan 1.x的导入路径,而from conan.tools.cmake import CMake是Conan 2.x/1.35+之后推出的新CMake集成接口。新的CMake类依赖CMakeToolchain生成器产生的conanbuild.conf文件读取构建配置,但是你当前的generators列表里没有配置对应的生成器,导致文件缺失。 - 依赖处理逻辑冲突:你在CMake代码中使用了cmake-conan模块处理依赖,同时又在conanfile.py中声明了依赖、配置了CMake相关生成器,两套依赖处理逻辑会互相干扰,也会导致构建配置文件路径异常。
- 冗余操作冲突:你在
build()方法中已经调用了cmake.install(),后续package()方法再次调用_configure_cmake()和install也可能引发配置异常。
解决方法
你可以选择以下任意一种方案修复问题:
方案1:统一使用Conan 1.x旧CMake API(改动最小)
- 把
from conan.tools.cmake import CMake, CMakeToolchain替换成from conans import CMake,使用1.x原生的CMake辅助类,不需要依赖conanbuild.conf文件。 - 移除CMake代码中的cmake-conan模块调用,直接依赖conanfile生成的
Find*.cmake文件找依赖,避免两套逻辑冲突。 - 删掉
package()方法中重复的cmake = self._configure_cmake()和cmake.install()调用,build()阶段已经完成install,package()阶段只需要保留清理多余目录的逻辑即可。
修改后的conanfile.py参考:
import os from conans import ConanFile, tools, CMake from conans.tools import Version class BaseLibrary(ConanFile): name = "base-library" version = "1.0.0" description = """This is a test project with a library base::io and base::math and an executable cli.""" license = "MIT" generators = "cmake_find_package_multi", "cmake_find_package" default_options = {"fmt:shared": True} build_policy = "missing" settings = "os", "compiler", "build_type", "arch" exports_sources = "*" _cmake = None def requirements(self): if Version(self.version) >= "1.0.0": self.requires("fmt/8.0.1") def _configure_cmake(self): if self._cmake: return self._cmake self._cmake = CMake(self) self._cmake.configure(source_folder=".") return self._cmake def build(self): cmake = self._configure_cmake() cmake.build() cmake.install() def package(self): tools.rmdir(os.path.join(self.package_folder, "lib", "cmake")) tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig")) tools.rmdir(os.path.join(self.package_folder, "share")) def package_info(self): self.cpp_info.names["cmake_find_package"] = "base" self.cpp_info.names["cmake_find_package_multi"] = "base" self.cpp_info.names["pkg_config"] = "base"
方案2:正确配置新CMake集成接口
- 在
generators列表中添加CMakeToolchain,确保生成conanbuild.conf等配置文件。 - 移除CMake代码中的cmake-conan模块调用,构建时使用Conan生成的工具链文件传递配置。
- 移除
package()方法中重复的configure和install调用。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

