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

如何在Conan v1.59的package()中无硬编码复制cr_def.h

在Conan v1.59中自动复制依赖头文件到自身包

实现思路

不用硬编码路径,直接利用Conan内置的依赖信息变量获取ch-common包的安装目录,再将目标头文件复制到自身包的include目录中,这样你的库使用者只需引入你的包就能获取所需的枚举定义。

具体代码实现

在你的conanfile.py中修改package()方法,添加依赖头文件的复制逻辑:

from conans import ConanFile, CMake
import shutil
import os

class YourLibraryConan(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    requires = "ch-common/0.0.10@x/y"
    generators = "cmake"

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

    def package(self):
        # 保留原有安装自身公共头文件的逻辑
        self.copy("*.h", dst="include", src="include")
        
        # 获取ch-common包的头文件根目录
        ch_common_include_dir = self.deps_cpp_info["ch-common"].include_paths[0]
        # 拼接cr_def.h的完整路径
        cr_def_src = os.path.join(ch_common_include_dir, "cr_def.h")
        # 复制到当前包的include目录
        cr_def_dst = os.path.join(self.package_folder, "include", "cr_def.h")
        shutil.copy(cr_def_src, cr_def_dst)

关键细节说明

  • self.deps_cpp_info["ch-common"]是Conan提供的依赖包信息对象,其中include_paths字段存储了该包的所有头文件目录,对于仅含头文件的ch-common来说,列表中只会有一个元素。
  • 使用shutil.copy而非Conan自带的self.copy,是因为self.copy默认从项目源码目录读取文件,而我们需要从依赖包的安装目录读取。
  • 这种方式完全依赖Conan的依赖管理机制,不会因为环境或安装路径变化而失效,比硬编码路径更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:25:02