conan package() 必须用 self.copy() 显式复制动态库:windows 用 .dll→bin,linux/macos 用 .so/*.dylib→lib,且 keep_path=false;shared 选项需与 build() 一致,并在 package_info() 中设置 bindirs 和 env_info.path 确保运行时可见。

conan package() 里必须显式 copy 动态库文件
Conan 不会自动扫描或收集构建产物,self.copy() 是唯一可靠方式。动态库后缀因平台而异:.dll(Windows)、.so(Linux)、.dylib(macOS),漏掉任一平台就导致下游链接失败。
常见错误是只写 self.copy("*.so", dst="lib"),结果 Windows 用户 build 失败,报错 cannot find -lxxx 或 LINK : fatal error LNK1181: cannot open input file 'xxx.lib'。
- 必须按平台分别处理:用
self.settings.os判断,或直接全写(推荐) -
dst="bin"放.dll(Windows 运行时需在 PATH 中),dst="lib"放.so/.dylib/.a/.lib -
keep_path=False很关键——否则lib/x86_64-linux-gnu/libxxx.so会被原样复制,CMake 找不到
def package(self):
self.copy("*.h", dst="include", src="src")
self.copy("*.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.dylib", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False)
shared=True 选项必须和 build() 阶段一致
如果 options = {"shared": [True, False]},但 build() 里没传 shared 给 CMake,生成的其实是静态库,而 package() 却在找 .so——最终包里空空如也,下游 find_package() 成功但链接时报 undefined reference。
正确做法是在 build() 中显式控制构建类型:
一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。
- CMake 项目:用
cmake.definitions["BUILD_SHARED_LIBS"] = "ON" if self.options.shared else "OFF" - Makefile 项目:在
self.run("make ...")命令里加SHARED=1类参数 - 务必检查构建日志,确认输出的是
libxxx.so而非libxxx.a
package_info() 中要声明 runtime 目录(尤其 Windows)
仅靠 self.cpp_info.libs = ["xxx"] 不够。Windows 下 .dll 不参与链接,但运行时必须可加载。Conan 不会自动把 bin/ 加入 PATH,下游用户得自己处理。
解决办法是在 package_info() 中补上:
-
self.cpp_info.bindirs = ["bin"](告诉 Conan 这里放可执行或 DLL) -
self.env_info.PATH.append(os.path.join(self.package_folder, "bin"))(让conan install自动注入 PATH) - 若下游用 CMake +
CMakeDeps,还需self.cpp_info.set_property("cmake_find_mode", "both")确保find_library()能扫到bin/(某些旧版 CMake 默认只查lib/)
conan create 时别漏掉 --build=missing 和 -o shared=True
本地测试包是否真含动态库,最直接的方式是跑 conan create . user/channel -o shared=True --build=missing。漏掉 -o shared=True 就默认走静态,package() 里 copy 的 .so 根本不会生成;漏掉 --build=missing 可能复用缓存里的静态包,掩盖问题。
验证方法:执行完后进缓存目录(conan cache path xxx/1.0@user/channel),手动检查 bin/ 或 lib/ 下是否存在对应动态库文件。别只信命令行输出“Package 'xxx' built”——那只是 build 步骤完成,不等于 package 步骤成功复制了文件。










