A
Air官方
CMake 是 Qt 系与大量 C 及 CPlusPlus 应用的构建系统,交叉编译全靠 toolchain 文件。写对这份文件,是 CMake 路线的第一关。
▍toolchain 文件的核心字段
三条必写:CMAKE_SYSTEM_NAME 给通用系统标识(Linux 兼容语义最省事,鸿蒙应用层走 Linux 语义)、CMAKE_SYSTEM_PROCESSOR 设 aarch64;CMAKE_C_COMPILER 与 CMAKE_CXX_COMPILER 指向 NDK 的 clang 包装器;CMAKE_SYSROOT 或 CMAKE_FIND_ROOT_PATH 指向预编译栈前缀。再配 FIND_ROOT_PATH 的三种模式(只在根路径找库、只在根路径找程序分开控制),库从目标前缀找、构建期工具从宿主找,混了就出宿主与目标二进制错配。
▍第三方依赖的三种接法
一是 find_package 走配置文件模式,预编译栈里放好包配置;二是 pkg-config 模块(find_package(PkgConfig) 加 IMPORTED_TARGET),配好环境变量即可;三是手写 IMPORTED 目标,把库路径、头文件路径、链接选项写死在 CMake 里——最笨但最可控,深链依赖用它兜底。
▍常见错误
一,默认编译器探测到宿主 clang:toolchain 没在第一次 configure 前生效,改了 toolchain 要清空构建目录重 configure,缓存会咬住旧值。二,可执行工具用目标编译器编出来在构建机跑不了:宿主工具要走独立 native 命令(add_executable 加构建-only 属性)或预编译宿主版。三,install 前缀漂移:显式给 CMAKE_INSTALL_PREFIX,别依赖默认路径。四,静态库顺序:链接顺序敏感的库链要按依赖序排,CMake 不替你排序。
▍与 hvigor 的衔接
CMake 编出的库不进 hvigor 闭包,统一走预编译库目录整体打包(后续打包篇详述),CMake 侧只管把库正确装进前缀。
▍建议
toolchain 文件加注释、进版本库;每次环境变化(换 NDK、换栈)后用最小工程验证 toolchain,再上大工程。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
▍toolchain 文件的核心字段
三条必写:CMAKE_SYSTEM_NAME 给通用系统标识(Linux 兼容语义最省事,鸿蒙应用层走 Linux 语义)、CMAKE_SYSTEM_PROCESSOR 设 aarch64;CMAKE_C_COMPILER 与 CMAKE_CXX_COMPILER 指向 NDK 的 clang 包装器;CMAKE_SYSROOT 或 CMAKE_FIND_ROOT_PATH 指向预编译栈前缀。再配 FIND_ROOT_PATH 的三种模式(只在根路径找库、只在根路径找程序分开控制),库从目标前缀找、构建期工具从宿主找,混了就出宿主与目标二进制错配。
▍第三方依赖的三种接法
一是 find_package 走配置文件模式,预编译栈里放好包配置;二是 pkg-config 模块(find_package(PkgConfig) 加 IMPORTED_TARGET),配好环境变量即可;三是手写 IMPORTED 目标,把库路径、头文件路径、链接选项写死在 CMake 里——最笨但最可控,深链依赖用它兜底。
▍常见错误
一,默认编译器探测到宿主 clang:toolchain 没在第一次 configure 前生效,改了 toolchain 要清空构建目录重 configure,缓存会咬住旧值。二,可执行工具用目标编译器编出来在构建机跑不了:宿主工具要走独立 native 命令(add_executable 加构建-only 属性)或预编译宿主版。三,install 前缀漂移:显式给 CMAKE_INSTALL_PREFIX,别依赖默认路径。四,静态库顺序:链接顺序敏感的库链要按依赖序排,CMake 不替你排序。
▍与 hvigor 的衔接
CMake 编出的库不进 hvigor 闭包,统一走预编译库目录整体打包(后续打包篇详述),CMake 侧只管把库正确装进前缀。
▍建议
toolchain 文件加注释、进版本库;每次环境变化(换 NDK、换栈)后用最小工程验证 toolchain,再上大工程。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
楼主
7 天前