кртбегин так.o отсутствует для Android toolchain (пользовательская сборка)

я скомпилировал gdc вместе с gcc с помощью android build-gcc.sh сценарий, и включили новый заглушку в build / core / definitions.mk для работы с языковыми файлами D в рамках процесса сборки. Я знаю, что на данный момент все компилируется нормально, но моя проблема связана:

когда я создаю проект, я получаю эту ошибку:

ld: crtbegin_so.o: No such file: No such file or directory

Это верно и для обычных проектов только для c. Теперь я побежал быстро найти в моем каталоге сборки и обнаружил, что файл (crtbegin_so.o) существует в sysroot, который я указал, когда я скомпилировал gcc (или, скорее, когда build-gcc.sh построил его).

  • что я могу искать, чтобы найти решение этой проблемы?

  • копирование файлов локально и связывание непосредственно с ними будет достойным решением в промежуточные?

  • почему ld (или collect2) пытается включить их для gdc (язык D) связь?

4 ответов


проблема возникает и на NDK r7c для linux.

я обнаружил, что toolchain игнорирует местоположение платформы ($NDK_ROOT/платформы/android-8/arch-arm/usr/lib/) и ищет его в пути toolchain, что неверно.

однако, поскольку toolchain также ищет файл в текущем каталоге, одним из решений является символическая ссылка на правильную платформу crtbegin_so.o и crtend_so.o в источник каталог:

cd src && ln -s NDK_ROOT/platforms/android-8/arch-arm/usr/lib/crtbegin_so.a

cd src && ln -s NDK_ROOT/platforms/android-8/arch-arm/usr/lib/crtend_so.a

ваш второй пункт должен работать (где вы можете сделать символическую ссылку, а не копию)

Примечание 1:это предполагает, что код компилируется для API8 (Android 2.2) с помощью NDK. Пожалуйста, измените путь к правильному пути в соответствии с вашим требованием.

примечание 2:настройки флагов, используемых:

./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/" \
LIBS="-lc"

Я нашел, что добавление --sysroot=$(SYSROOT) в параметрах компилятора Исправлена ошибка:

не удается открыть crtbegin_so.О: нет такого файла или каталога

из моего файла makefile...

CC= $(CROSS_COMPILE)gcc -fvisibility-hidded $(INC) $(LIB) -shared

Примечание: это предполагает, что setenv-android.sh был запущен для настройки среды
$. ./setenv-android.sh


в моем случае кавычки отсутствовали в пути sysroot. Когда я изменился

--sysroot=${ANDROID_NDK}\platforms\android-17\arch-arm

to

--sysroot="${ANDROID_NDK}\platforms\android-17\arch-arm" 

проект был скомпилирован и успешно связан.


я столкнулся с тем же вопросом в двух отдельных случаях:

  1. в здании boost для android
  2. при использовании android-cmake.

как только я переключился на standalone toolchain вопрос ушел, Вот пример команды которая готовит standalone toolchain

$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=android-toolchain --ndk-dir=$NDK_ROOT --system=darwin-x86_64 --toolchain=arm-linux-androideabi-4.9

Boost specific

для повышения вам нужно указать --sysroot несколько раз в jam

<compileflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm
<linkflags>--sysroot=$NDK_ROOT/platforms/android-9/arch-arm