Android: ошибка: невозможно открыть crtbegin_dynamic.o: нет такого файла или каталога

19

Я использовал следующее ...

  

~ / Разработка / Android / android-ndk-r8c / build / tools / make-standalone-toolchain.sh --platform = android-9 --install-dir = / Пользователи / me / toolchain

Затем я создаю следующий файл кода ...

int main ()
{
  return 0;
}

Я пробовал ...

<toolchain>/arm-linux-androideabi-gcc test.c

Я также пробовал

 <toolchain>/arm-linux-androideabi-gcc --sysroot=<toolchain>/sysroot test.c 

Оба возвращаются ...

 toolchain/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
    
задан Jackie 28.05.2013 в 17:14
источник
  • Есть ли способ связать это вручную, поскольку что-то явно отключено? –  Jackie 28.05.2013 в 18:00
  • Я также попытался экспортировать LD = arm-linux-androideabi-ld, но опять же не кубики. –  Jackie 28.05.2013 в 18:01

4 ответа

19

Чтобы сделать это проще, просто установите sysroot:

<toolchain>/arm-linux-androideabi-g++ ~/test.c -o ~/test --sysroot=/home/user/android-ndk/platforms/android-9/arch-arm/
    
ответ дан BlueSilver 11.07.2013 в 08:24
источник
  • Спасибо, --sysroot кажется действительно обязательной вещью для сборки без этой досадной ndk-build обертки. –  kagali-san 06.01.2014 в 13:00
  • большое спасибо @BlueSilver требуется много времени, чтобы узнать это! –  NandhaKumar 09.10.2017 в 13:09
  • Добро пожаловать. Это было 4 года назад :) –  BlueSilver 10.10.2017 в 14:32
10
  

/ arm-linux-androideabi-gcc test.c

Вам не хватает sysroot в этом.

  

/ arm-linux-androideabi-gcc --sysroot = / sysroot test.c

Этот, sysroot ошибочен. Это должно быть похоже на:

--sysroot=/opt/android-ndk-r9/platforms/android-18/arch-arm

Вам также необходимо экспортировать LD (все инструменты должны быть на пути):

$ echo $PATH
/opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin:
/opt/android-sdk-macosx/tools/:/opt/android-sdk-macosx/platform-tools/:/opt/local/bin:
/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
$ echo $LD
arm-linux-androideabi-ld

Вероятно, вы должны экспортировать все инструменты в toolchain:

export CPP=arm-linux-androideabi-cpp
export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++
export LD=arm-linux-androideabi-ld
export AS=arm-linux-androideabi-as
export AR=arm-linux-androideabi-ar
export RANLIB=arm-linux-androideabi-ranlib

Если вы работаете над проектом Autoconf, добавьте следующее:

$ echo $ANDROID_SYSROOT
/opt/android-ndk-r9/platforms/android-18/arch-arm
export CPPFLAGS="--sysroot=$ANDROID_SYSROOT"
export CFLAGS="--sysroot=$ANDROID_SYSROOT"
export CXXFLAGS="--sysroot=$ANDROID_SYSROOT"
    
ответ дан jww 09.01.2014 в 15:06
источник
2

Хорошо оглядываясь назад Я сделал свою инструментальную цепочку для Android-9 за команду ...

  

~ / Разработка / Android / android-ndk-r8c / build / tools / make-standalone-toolchain.sh --platform = android-9 --install-dir = / tmp / my-toolchain

Когда я побежал ...

<install>/android-ndk-r8c$ find ./ -name crtbegin_dynamic*
.//platforms/android-14/arch-arm/usr/lib/crtbegin_dynamic.o
.//platforms/android-14/arch-mips/usr/lib/crtbegin_dynamic.o
.//platforms/android-14/arch-x86/usr/lib/crtbegin_dynamic.o
.//platforms/android-3/arch-arm/usr/lib/crtbegin_dynamic.o
.//platforms/android-4/arch-arm/usr/lib/crtbegin_dynamic.o
.//platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o
.//platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o
.//platforms/android-9/arch-mips/usr/lib/crtbegin_dynamic.o
.//platforms/android-9/arch-x86/usr/lib/crtbegin_dynamic.o

Как вы можете видеть, моя установка Android-9 по какой-то причине не имеет этого файла. Я перестроил для android-14, и все работает отлично. У кого-нибудь есть идея, как это получилось? Файл Bonehead перемещается с моей стороны?

    
ответ дан Jackie 28.05.2013 в 18:15
источник
  • Это неправильный ответ. Синтаксис BlueSilver - это то, чего не хватало в командной строке, вызвавшей отсутствие crtbegin_dynamic.o. –  jww 09.01.2014 в 14:59
0

Это то, что сработало для меня, я пришел к этому вопросу с той же проблемой, я пытаюсь построить gch-4.8 toolchain в NDK и столкнулся с той же проблемой. Дело в том, что я немного отличаюсь от своей ситуации: я основал Android-устройство, а это значит, что у меня есть библиотека Bionic libc.so и libdl.so в /system/lib . Я получал эту ошибку при настройке для libgomp :

toolchain-build/binutils-2.23/ld/ld-new: cannot find crtbegin_dynamic.o: No such file or directory
toolchain-build/binutils-2.23/ld/ld-new: cannot find -lc
toolchain-build/binutils-2.23/ld/ld-new: cannot find -ldl
toolchain-build/binutils-2.23/ld/ld-new: cannot find crtend_android.o: No such file or directory

Файл Make устанавливал параметр -B для определенного каталога toolchain/gcc-4.8/gcc/ , поэтому я создал символические ссылки из этих двух общих библиотек в /system/lib до gcc-4.8/gcc . Затем я привязал crtbegin_dynamic.o и crtend_android.o к объектным файлам crtbegin.o и crtend.o , которые были скомпилированы и установлены в toolchain-build / prefix / lib / gcc / arm-linux-androideabi / 4.8 / the find ' команда может помочь вам найти их.

Команды, которые я использовал для создания символических ссылок, выглядели следующим образом:

ln -s ../../prefix/lib/gcc/arm-linux-androideabi/4.8/crtend.o crtend_android.o

из каталога toolchian-build/gcc-4.8/gcc , для меня это работало, потому что именно там, где конфигурация указывала на поиск с опцией -B make , перешла на xgcc .

Я надеюсь, что это поможет кому-то. Время перехода на libatomic ; )     

ответ дан Overloaded_Operator 14.07.2014 в 13:02
источник