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

Я скомпилировал 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 проектов. Теперь я выполнил быстрый поиск в моем каталоге сборки и обнаружил, что файл (crtbegin_so.o) существует в sysroot, указанном мной при компиляции gcc (точнее, когда build-gcc.sh его собрал).

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

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

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

4 ответа

Решение

Проблема возникает и на 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"

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

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

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

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

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

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

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

в

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

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

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

  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
Другие вопросы по тегам