`ld: нераспознанный режим эмуляции: armelf_linux_eabi` при кросс-компиляции с Android NDK - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь кросс-компилировать библиотеку с открытым исходным кодом libsndfile с Android NDK.Мой хост - это подсистема Ubuntu под Windows 10 и целевая система Android (сейчас это будет делать любой).Для сборки я использую настройку autogen + configure, как описано в doc файла 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

Чтобы сделать это еще более точным, я думаю, что проблема /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

К сожалению, это не повлияло навывод, который был таким же, как в лог-файле:

/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

У кого-нибудь есть идея, что я мог бы попробовать дальше?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Если вы испытываете это при компиляции с 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
0 голосов
/ 04 октября 2018

Самое простое решение - просто использовать автономный набор инструментов , поэтому мы позаботимся о деталях для вас.

Если вы по какой-то причине не можете использовать это, проблема, с которой вы столкнулись 'то, что вы вызываете компилятор неправильно.

Если вы вызываете его через оболочку 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...