与 Android NDK 交叉编译时,`ld: 无法识别的模拟模式:armelf_linux_eabi`

Ala*_*lan 6 linker android linker-errors ld android-ndk

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

#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
Run Code Online (Sandbox Code Playgroud)

为了更准确地说,我认为问题是/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi似乎人们已经遇到过这个问题,正如这篇文章中所见,但到目前为止我还没有找到令人满意的答案。按照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
Run Code Online (Sandbox Code Playgroud)

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

/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
Run Code Online (Sandbox Code Playgroud)

有谁知道我下一步可以尝试什么?

Dan*_*ert 3

如果您使用的是 r19 或更高版本,请参阅BuildSystemMaintainers.md以获取有关为 Android 构建调用 clang 的说明。这个问题中讨论的问题对于新的 NDK 来说已经过时了。如果您使用的是较旧的 NDK 并且无法升级,请参阅下文。

最简单的解决方案是仅使用独立的工具链,以便我们为您处理细节。

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

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

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

clang++ \
    --target=armv7a-linux-androideabi17 \
    -gcc-toolchain $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
Run Code Online (Sandbox Code Playgroud)