conan install 是如何指定目标架构(如 arm64、x86_64) Conan 通过settings控制目标架构,不是靠命令行传参数,而是靠 profile 或直接在命令中用--settings显式声明。不配对的arch值会导致找不到二进制包
conan install 是如何指定目标架构(如 arm64、x86_64)Conan 通过 settings 控制目标架构,不是靠命令行传参数,而是靠 profile 或直接在命令中用 --settings 显式声明。不配对的 arch 值会导致找不到二进制包,甚至静默回退到源码构建(如果允许的话)。 常见错误现象:ERROR: Missing binary for xxx/1.0: 'xxx/1.0:package_id' not found,实际就是 arch 不匹配,但 Conan 没报“arch 不一致”,只说“没这个包”。
profile 里 arch 设置错会导致什么profile 的 arch 值决定 package ID 的计算结果,进而决定 Conan 去远程拉哪个二进制。设错后不会报错,但可能拉到 x86_64 的库却在 arm64 上链接,最终在 ld 阶段失败,报类似 file format not recognized 或 cannot execute binary file。
CMake 构建时 arch 怎么和 Conan 对齐CMake 本身不感知 arch,它靠 Conan 生成的 CMakeToolchain 注入目标架构信息(如 CMAKE_SYSTEM_PROCESSOR)。如果 CMakeLists.txt 里硬编码了 set(CMAKE_SYSTEM_PROCESSOR "x86_64"),会和 Conan 的 arch 冲突,导致生成的 Ninja 文件用错工具链。
为什么 armv7 和 armv8 算不同架构Conan 把 arch 当作不可降级的维度:armv7 二进制无法在 armv8 CPU 上运行(除非内核开启兼容模式,但 Conan 不假设这种环境)。所以 arch=armv7 和 arch=armv8 生成完全不同的 package ID,哪怕源码相同、编译器相同。
C++ 项目里架构不是个开关,是贯穿 recipe、profile、toolchain、linker 的一致性契约。最容易被忽略的是:profile 里的 arch 和你实际部署目标的 ABI 是否真的一致,而不是“看起来像”。 |
2022-05-14
2021-11-29
2022-04-04
2022-06-24
2021-11-25