交叉编译Halide为Android arm64-v8a静态库时出现链接未定义符号错误
错误根因
你当前的交叉编译配置存在多处缺失,导致构建过程混淆了**宿主系统(macOS x86_64)和目标系统(Android arm64-v8a)**的编译目标:
- 未指定Android NDK官方交叉编译工具链,CMake没有真正进入Android交叉编译模式,默认仍使用macOS本地编译器构建程序
- 未关闭Halide默认开启的测试用例构建:测试用例需要在宿主系统运行,但你编译出的Halide库是Android架构,本地x86_64编译器链接不兼容的Android架构库自然会报错
CLANG_TABLEGEN参数配置错误,只指定到了目录,没有指向具体的clang-tblgen二进制文件- cmake命令存在笔误:
-S .-B build缺少空格,应为-S . -B build
修正方案
按照以下步骤调整配置即可:
- 提前准备好Android NDK(建议使用r21~r25版本,和你使用的LLVM 12版本兼容性更好),在cmake参数中添加NDK工具链相关配置
- 关闭测试、示例程序的构建,避免宿主系统链接目标架构库的冲突
- 修正
CLANG_TABLEGEN的路径配置
修正后的cmake命令示例(将<你的NDK路径>替换为你本地NDK的实际存放路径,ANDROID_PLATFORM可根据你的最低兼容Android版本调整):
$ cmake -S . -B build \ -DCMAKE_CROSSCOMPILING=True \ -DCMAKE_TOOLCHAIN_FILE=<你的NDK路径>/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-21 \ -DHalide_TARGET=arm-64-android \ -DHalide_SHARED_LLVM=ON \ -DBUILD_SHARED_LIBS=OFF \ -DBUILD_TESTING=OFF \ -DHalide_BUILD_TESTS=OFF \ -DHalide_BUILD_APPS=OFF \ -DLLVM_DIR=/usr/local/Cellar/llvm/12.0.1/lib/cmake/llvm \ -DClang_DIR=/usr/local/Cellar/llvm/12.0.1/lib/cmake/clang \ -DLLD_DIR=/usr/local/Cellar/llvm/12.0.1/lib/cmake/lld \ -DLLVM_TABLEGEN=/usr/local/Cellar/llvm/12.0.1/bin/llvm-tblgen \ -DCLANG_TABLEGEN=/usr/local/Cellar/llvm/12.0.1/bin/clang-tblgen \ -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-android \ -DLLVM_TARGET_ARCH=aarch64 \ -DLLVM_TARGETS_TO_BUILD=aarch64 \ -DCMAKE_BUILD_TYPE=Debug
之后再执行cmake --build ./build即可正常完成Android架构静态库的编译。
内容的提问来源于stack exchange,提问作者Erik Nouroyan
相关产品推荐
相关产品推荐

