【问题标题】:`ld: unrecognised emulation mode: armelf_linux_eabi` when cross-compiling with Android NDK`ld: unrecognized emulation mode: armelf_linux_eabi` 与 Android NDK 交叉编译时
【发布时间】:2019-03-09 20:29:54
【问题描述】:

我正在尝试使用 Android NDK 交叉编译开源库 libsndfile。 我的主机是 Windows 10 下的 Ubuntu 子系统,目标是 android 系统(现在任何人都可以)。 对于构建,我使用 autogen+configure 设置,如 doc 的 libsndfile。 编译在链接阶段停止,生成一个带有多个错误的冗长日志文件(略多于 400 行)。 一开始的错误似乎并不严重,但配置探测编译器设置,如中所述 this post。 最后一条错误消息指向链接器问题。 这里我认为是日志文件的相关摘录:

#include "..." search starts here:
#include <...> search starts here:
/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/include
End of search list.
 "/usr/bin/ld" --sysroot=../android-ndk-r18/platforms/android-17/arch-arm -z relro -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o a.out ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib -L../android-ndk-r18/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib -L/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/lib/linux/arm -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib /tmp/conftest-5c2dd3.o -lgcc -ldl -lc -lgcc -ldl ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtend_android.o
/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure:4138: $? = 1
configure:4176: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "libsndfile"
| #define PACKAGE_TARNAME "libsndfile"
| #define PACKAGE_VERSION "1.0.29pre1"
| #define PACKAGE_STRING "libsndfile 1.0.29pre1"
| #define PACKAGE_BUGREPORT "sndfile@mega-nerd.com"
| #define PACKAGE_URL "http://www.mega-nerd.com/libsndfile/"
| #define PACKAGE "libsndfile"
| #define VERSION "1.0.29pre1"
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:4181: error: in `/home/alan/libsndfile':
configure:4183: error: C compiler cannot create executables

为了更准确,我认为问题是/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi。 看来大家已经遇到过这个问题了,可以看this post, 但到目前为止,我还没有找到令人满意的答案。 关注this suggestion on SO, 我尝试通过使用 --verbose 选项自行运行链接器来获取有关该错误的更多信息:

"/usr/bin/ld" --verbose --sysroot=../android-ndk-r18/platforms/android-17/arch-arm -z relro -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o a.out ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib -L../android-ndk-r18/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib -L/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/lib/linux/arm -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib /tmp/conftest-5c2dd3.o -lgcc -ldl -lc -lgcc -ldl ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtend_android.o

不幸的是,这对输出没有影响,这与日志文件中的相同:

/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe

有人知道我接下来可以尝试什么吗?

【问题讨论】:

    标签: android android-ndk linker linker-errors ld


    【解决方案1】:

    最简单的解决方案是使用standalone toolchain,以便我们为您处理详细信息。

    如果由于某种原因您不能使用它,那么您遇到的问题是您错误地调用了编译器。

    如果您通过 GCC 包装器调用它(r18 中没有 GCC;GCC 二进制文件是调用 Clang 的脚本),那么您正在运行到 https://github.com/android-ndk/ndk/issues/805

    如果你直接调用 Clang,你需要使用-gcc-toolchain 告诉 Clang binutils 在哪里。即

    clang++ \
        --target=armv7a-linux-androideabi17 \
        -gcc-toolchain $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    

    请注意,如果您在 NDK r19 发布后获得此答案,则答案要简单得多:https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md

    【讨论】:

      【解决方案2】:

      如果您在使用 CMake 编译时遇到此问题,则可能是此处描述的 CMake 错误: https://gitlab.kitware.com/cmake/cmake/issues/18739

      简而言之,临时解决方法不是使用独立工具链,而是使用 NDK 的工具链:

      cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_shared -DANDROID_TOOLCHAIN=clang -DANDROID_PLATFORM=android-21 -DANDROID_ABI=arm64-v8a -DCMAKE_INSTALL_PREFIX=$_PROJECT_DIR/install/android/arm64-v8a
      

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2021-09-07
        • 2021-07-10
        • 2015-01-10
        • 1970-01-01
        相关资源
        最近更新 更多