crtbegin_so.o отсутствует для набора инструментов Android (пользовательская сборка) - PullRequest
7 голосов
/ 30 июля 2011

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

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

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

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

  • Какие вещи я мог бы найти, чтобы найти решение этой проблемы?

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

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

Ответы [ 4 ]

12 голосов
/ 24 апреля 2012

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

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

Однако, поскольку цепочка инструментов также ищет файл в текущем каталоге, одним из решений является символическая ссылка на правильную платформу 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"
5 голосов
/ 26 января 2016

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

не может открыть crtbegin_so.o: нет такого файла или каталога

из моего make-файла ...

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

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

1 голос
/ 24 апреля 2016

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

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

на

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

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

0 голосов
/ 29 ноября 2015

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

  1. во время сборки boost для андроида
  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

Повышение специфично

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

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