Arhn - архитектура программирования

Проблемы с компиляцией объекта с использованием arm-linux-androideabi-gcc

Задний план

  • OSX это ОС
  • R8 НДК

Я пытаюсь скомпилировать следующий класс с помощью компилятора Android GCC...

#include <stdint.h>
int main (void){
   return 0;
}

Я делаю это с помощью следующей команды...

un@un:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello

Я получил...

In file included from hello.c:1:0:
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/include/stdint.h:3:26: fatal error: stdint.h: No such file or directory
compilation terminated.

Итак, из-за отсутствия знаний gcc (но некоторых способностей Google) я нахожу это и пробую...

un@un:~/Development/Code/OpenGL$ ~/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc hello.c -o hello -ffreestanding

и я получаю...

/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc
/Users/un/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status

Может ли кто-нибудь помочь мне с тем, что я делаю неправильно? Я пропустил ссылку или что? Android.mk не вариант.

UPDATE тоже не работает...

arm-linux-androideabi-gcc hello.c --sysroot=~/Development/Android/android-ndk-r8c/platforms/android-9/arch-arm
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc
/Users/jackiegleason/Development/Android/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status
13.01.2013

Ответы:


1

Вы должны указать GCC, где найти системные файлы и заголовки Android. Либо используйте:

  1. ndk-build и Android.mk с BUILD_EXECUTABLE
  2. или вариант --sysroot GCC

[1]

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c

include $(BUILD_EXECUTABLE)

[2]

# Change `android-9` with the level you target
/path/to/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt\
/darwin-x86/bin/arm-linux-androideabi-gcc\
 --sysroot /path/to/android-ndk-r8c/platforms/android-9/arch-arm/\
  foo.c -o foo

# Or generate a ready-to-use standalone toolchain (better)
/path/to/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \
--platform=android-9 \
--install-dir=/tmp/my-android-toolchain

export SYSROOT=/tmp/my-android-toolchain/sysroot

/path/to/arm-linux-androideabi-gcc --sysroot $SYSROOT foo.c -o foo
13.01.2013
  • Sysroot не работал, Android.mk не вариант. Я мог бы заставить его работать, если бы сделал автономную цепочку инструментов, но нет ли способа просто связать библиотеки req? 14.01.2013
  • sysroot действительно работает (вы должны были сделать ошибку или опечатку). Приведенные выше решения являются вариантами одного и того же: сообщите вашему компилятору, где найти системные ресурсы. Ни больше ни меньше. И если вам нужно официально использовать подробные шаги/флаги, просто используйте ndk-build V=1, чтобы увидеть результаты. 14.01.2013
  • Здесь не сработал мой код... arm-linux-androideabi-gcc hello.c --sysroot=~/Development/Android/android-ndk-r8c/platforms/android-9/arch-arm 14.01.2013
  • В контексте этого вопроса цепочка инструментов предоставляется Android NDK, поэтому соответствующий gcc должен всегда быть настроен с --with-sysroot. 26.05.2016

  • 2

    Итак, поскольку я не хочу использовать файл Android.mk, я пошел дальше и создал автономную цепочку инструментов. это делается с помощью следующего...

    /Users/un/Downloads/android-ndk-r8d/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/tmp/my-toolchain
    /tmp/my-toolchain/bin/arm-linux-androideabi-gcc hello.c 
    

    Я хотел бы знать, что такое «альтернатива» с точки зрения связывания gcc, которое я мог бы сделать.

    13.01.2013
  • Также дважды проверьте файл application.mk и убедитесь, что версия вашей платформы выше 8. 21.06.2013
  • Мне нужно больше аргументов в ОС Ubuntu: /home/user/android-ndk-r10d/build/tools$ ./make-standalone-toolchain.sh --platform=android-21 --install-dir=/ tmp/my-toolchain --toolchain=arm-linux-androideabi-4.9 --system=linux-x86_64 И для Mac OS X: /Users/user/android-ndk-r10d/build/tools$ ./make-standalone- toolchain.sh --platform=android-21 --install-dir=/tmp/my-toolchain --ndk-dir=/Users/user/android-ndk-r10d/ --toolchain=arm-linux-androideabi-4.9 --система=дарвин-x86_64 29.01.2015

  • 3

    Этот ответ добавляет немного больше деталей к ответу @deltheil. У меня были похожие проблемы, когда я пытался скомпилировать инструменты I2C для отладки шины I2C на Android. . Каким-то образом, после более чем дня борьбы с файлами make и различных параметров, включая параметры --sysroot и --dynamic-linker и т. д., я, наконец, попытался скомпилировать его в дереве Android AOSP. Я использовал Google Nexus-S AOSP для создания бинарного файла, который я намеревался запустить на телефоне Samsung S3. Я создал папку с именем i2c-tools для исходников внутри папки AOSP/external, скопировал Android.mk, Cleanspec.mk и MODULE_LICENCE из другой исполняемой папки (ping) и модифицировал ее для i2c-tools следующим образом:

    ifneq ($(TARGET_SIMULATOR), true)
    
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_SRC_FILES := i2cdetect.c i2cbusses.c
    
    LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
    LOCAL_MODULE := i2cdetect
    LOCAL_MODULE_TAGS := tests
    LOCAL_SHARED_LIBRARIES := libc
    
    include $(BUILD_EXECUTABLE)
    
    endif
    

    Тогда я просто побежал:

    source build/envsetup.sh
    make i2cdetect
    

    из базовой папки AOSP и вуаля, у меня был рабочий исполняемый файл в папке out/target/product/generic/system/bin/. Обратите внимание, что мне пришлось скопировать все необходимые исходные файлы и файлы заголовков из исходных папок (i2c-tools)/tools & include, а также изменить некоторые из #include, чтобы удалить дополнительный путь для файлов заголовков, которые теперь находились в том же месте, что и c-источник.

    21.06.2013
  • Обратите внимание, чтобы избежать пробелов после имени модуля. В приведенном выше примере такой проблемы нет. 05.02.2014

  • 4

    В моем случае мне нужен был файл .o, и мне не нужно было определять main(). Мне пришлось указать переключатель -c:

    ~/ax/arm-linux-androideabi-g++ --sysroot=~/an/platforms/android-8/arch-arm/ -c dummy.c
    

    где ~/ax и ~/an — ссылки:

    ax -> ~/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/
    an -> ~/android-ndk-r9d/
    

    сделал dummy.o.

    11.04.2014

    5

    я решил проблему, менеджер файлов сжатия по умолчанию в Ubuntu не извлекал символические ссылки, поэтому я попытался: tar jxf filename.tar.bz2 распаковать ndk.tar.bz2, и теперь он работает нормально

    20.09.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..