如何在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
相关产品推荐
相关产品推荐

