Conan 2.0不使用CMakeDeps时配置CMakeToolchain生成器的方法
在Conan 2.0中使用CMakeToolchain且不启用CMakeDeps的配置方案
核心思路
由于不启用CMakeDeps,Conan不会自动生成依赖包的CMake配置导入逻辑,因此需要手动通过CMakeToolchain向CMake的CMAKE_PREFIX_PATH变量添加Conan缓存(或可编辑包本地目录)中依赖包的安装前缀路径——CMake会自动在这些路径下搜索*-config.cmake或Find*.cmake文件。
针对Conan缓存包的配置步骤
以依赖say/0.1的hello包为例,在hello包的conanfile.py中修改generate方法,手动注入依赖包的缓存路径:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain import os class HelloConan(ConanFile): name = "hello" version = "0.1" requires = "say/0.1" settings = "os", "compiler", "build_type", "arch" def generate(self): tc = CMakeToolchain(self) # 收集所有依赖包的缓存路径 prefix_paths = [dep.package_folder for dep in self.dependencies.values()] # 根据系统处理路径分隔符 if self.settings.os == "Windows": tc.variables["CMAKE_PREFIX_PATH"] = ";".join(prefix_paths) else: tc.variables["CMAKE_PREFIX_PATH"] = ":".join(prefix_paths) tc.generate()
生成的toolchain文件会自动将所有依赖包的Conan缓存路径注入CMAKE_PREFIX_PATH,此时CMake执行find_package(say REQUIRED)时就能找到对应的say-config.cmake文件。
可编辑模式的处理
当依赖包处于可编辑模式时,dep.package_folder会指向本地开发目录而非Conan缓存,只需确保本地目录中存在正确的CMake配置文件,并根据实际情况调整路径:
def generate(self): tc = CMakeToolchain(self) prefix_paths = [] for name, dep in self.dependencies.items(): if dep.is_editable: # 假设可编辑包的配置文件在本地install目录下(需提前执行本地安装) editable_prefix = os.path.join(dep.source_folder, "install") prefix_paths.append(editable_prefix) else: prefix_paths.append(dep.package_folder) # 处理路径分隔符 if self.settings.os == "Windows": tc.variables["CMAKE_PREFIX_PATH"] = ";".join(prefix_paths) else: tc.variables["CMAKE_PREFIX_PATH"] = ":".join(prefix_paths) tc.generate()
额外注意
- 可编辑包需提前通过
cmake --install将配置文件安装到指定的install目录,或者直接在本地开发目录根目录放置*-config.cmake文件; - 若依赖层级复杂,需确保遍历所有间接依赖并添加其路径。
内容的提问来源于stack exchange,提问作者schrödinbug
相关产品推荐
相关产品推荐

