conan install 必须在 conanfile.txt 或 conanfile.py 所在目录执行,不能在 build/ 或 src/ 等其他目录下运行;否则报错“no conanfile.py or conanfile.txt found”。

conan install 必须在 conanfile 所在目录执行
很多人把 conanfile.txt 放在项目根目录,却在 build/ 目录下运行 conan install,结果报错 ConanException: No conanfile.py or conanfile.txt found。这不是路径没配对,是根本没找对地方。
正确做法是:确保 conan install . --build=missing 在和 conanfile.txt(或 conanfile.py)同一级的目录下执行——通常就是 CMake 源码根目录,不是 build/,也不是 src/。
- 如果旧工程习惯把
CMakeLists.txt放在src/,就把conanfile.txt也放进去,并 cd 进去再运行conan install - 别依赖环境变量或全局 profile 路径;显式传
--profile更可靠,比如--profile:host=profiles/arm64-release -
conan install成功后会在当前目录生成generators/和conan.lock,这两个必须被 CMake 读到,不能挪动
CMakeLists.txt 里必须禁用系统 find_package
旧工程往往有 find_package(OpenSSL REQUIRED) 或 find_package(fmt CONFIG REQUIRED),这些会优先走系统路径(比如 /usr/lib/x86_64-linux-gnu/libssl.so),而不是 Conan 下载的交叉版本。一旦混链,轻则运行时符号缺失,重则 ABI 不兼容崩溃。
Conan 2.x 的 CMakeDeps 生成的是 xxx-config.cmake 文件,它们不靠 CMAKE_MODULE_PATH,而是靠 find_package(xxx CONFIG) + 正确的 CMAKE_PREFIX_PATH。
- 在
CMakeLists.txt中project()之后、find_package()之前加:set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) - 确保
include(${CMAKE_BINARY_DIR}/generators/xxx-config.cmake)不要手动写——那是旧版cmake_find_package的用法;现代做法是让CMakeToolchain自动注入CMAKE_PREFIX_PATH - 删掉所有硬编码的
include_directories(/usr/include/openssl)或link_directories(/usr/lib)
交叉编译时 Profile 和 settings 必须严格匹配目标板
旧工程可能用 CC=aarch64-linux-gnu-gcc 环境变量驱动 CMake,但 Conan 不认这个。它只看 [settings] 和 [conf] ——漏一个,就可能拉来 x86_64 的 OpenSSL 静态库,链接时报 file not recognized: file format not recognized。
Profile 不是“大概对就行”。比如你用 Buildroot 生成的 sysroot,tools.build:sysroot 必须指向那个路径;compiler.version 必须和你实际用的 GCC 版本一致(12.3 ≠ 12);compiler.libcxx 要和你的 C++ 标准库实现对上(libstdc++ 还是 libc++)。
- 别复用
defaultprofile 做交叉编译;用conan profile new --detect只能生成 host profile,交叉 profile 得手写 -
arch=armv8和arch=armv8.2是两个不同 ABI,不能混;os=Linux和os=Android也不能混 - 如果用
CMakeToolchain,记得在 profile 里设tools.cmake.cmaketoolchain:generator=Ninja,否则生成的 toolchain 可能不兼容你选的构建器
conanfile.txt 升级到 conanfile.py 后,package() 方法容易漏拷文件
旧工程若自己打包内部库(比如 myutils/1.0.0),改用 conanfile.py 后,常出现下游 find_package(myutils CONFIG) 找不到 target,或链接时报 undefined reference。问题不在 CMake,而在 package(self) 没把头文件和库按约定路径放对。
Conan 包结构是强约定:include/ 下放头文件,lib/ 下放 .a,bin/ 下放 .so。CMakeDeps 生成的 myutils-config.cmake 就是按这个结构反推路径的。
- 别写
self.copy("*.h", dst="include", src="src")就完事;确认src是相对 conanfile.py 的路径,且dst="include"对应最终包内include/ - 静态库要进
lib/,动态库进bin/(除非你明确设了fPIC=False且不用 dlopen) - 如果用了
cmake.install(),确保cmake.install(path=self.package_folder),否则头文件可能落在 build 目录里出不来
conan install,而是让整个依赖解析链从 profile → conanfile → generators → CMakeLists.txt 全部对齐。尤其交叉场景下,compiler.version 差 0.1、sysroot 少一个斜杠,都足以让链接器静默失败。











