You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Conan与CMake:如何从无CMakeLists的其他项目获取项目目录

实现步骤

1. 编写项目A的Conan配方(无需修改项目A原有内容)

项目A是纯配置文件无构建逻辑,直接编写conanfile.py放在项目A根目录即可,内容如下:

from conan import ConanFile
import os

class ProjectAConan(ConanFile):
    name = "project_a"
    version = "1.0.0"
    # 导出项目A所有配置文件,可根据实际配置文件路径调整匹配规则
    exports_sources = "*"

    def build(self):
        # 无编译逻辑,空实现即可
        pass

    def package(self):
        # 将所有配置文件拷贝到包的config目录下,也可以保持原有目录结构
        self.copy("*", dst="config")

    def package_info(self):
        # 声明CMake目标和命名规则,方便下游查找
        self.cpp_info.set_property("cmake_file_name", "ProjectA")
        self.cpp_info.set_property("cmake_target_name", "ProjectA::ProjectA")
        # 可选:直接给下游暴露配置目录的CMake变量
        self.cpp_info.set_property("cmake_user_code", 
            f"set(PROJECT_A_CONFIG_DIR \"{os.path.join(self.package_folder, 'config')}\" CACHE PATH \"Path to project A configs\")"
        )

写完后执行以下命令将项目A打包到本地Conan缓存:

conan create .

2. 配置项目B的依赖

在项目B的conanfile.py中添加项目A的依赖:

class ProjectBConan(ConanFile):
    # 其他配置省略
    requires = "project_a/1.0.0"
    generators = "CMakeDeps", "CMakeToolchain"

执行conan install .生成项目B的依赖配置文件。

3. 在项目B的CMakeLists中引用配置目录

Conan会自动生成ProjectAConfig.cmake,直接查找并使用暴露的变量即可:

cmake_minimum_required(VERSION 3.15)
project(project_b)

# 查找项目A的依赖
find_package(ProjectA REQUIRED)

# 你的测试目标配置
add_executable(test_b test.cpp)

# 方式1:使用Conan自动暴露的包根目录变量拼接配置路径
target_compile_definitions(test_b PRIVATE
  PROJECT_A_CONFIG_PATH="${ProjectA_PACKAGE_FOLDER}/config"
)

# 方式2:使用你在项目A配方里自定义的PROJECT_A_CONFIG_DIR变量
target_include_directories(test_b PRIVATE ${PROJECT_A_CONFIG_DIR})

补充说明

  • 如果不需要保留配置文件的原有结构,也可以在项目A的package方法中按分类拷贝到不同目录,下游按需引用即可。
  • 整个流程不需要修改项目A的任何原有文件,完全通过Conan配方实现目录导出。

内容的提问来源于stack exchange,提问作者cauchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:06:02