Как настроить GCC для компиляции для Android? - PullRequest
2 голосов
/ 16 июня 2011

Я прочитал в документации по gcc, что он поддерживает создание бинарных файлов Android с ключами -mandroid и -mbionic. Сначала я попробовал это с родным gcc, собранным из SVN. Результат:

dancsi@dancsi-VirtualBox:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-linux-gnu/4.7.0/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ../source/configure --enable-threads --disable-nls
Thread model: posix
gcc version 4.7.0 20110611 (experimental) (GCC)
dancsi@dancsi-VirtualBox:~$ g++ test.cpp -mandroid -o test.out
dancsi@dancsi-VirtualBox:~$ file test.out
test.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

По сути, это не удалось. Затем я попытался скомпилировать те же исходные коды gcc с target = arm-linux-androideabi (без определения sysroot, ...), и он прошел настройку, но не смог собрать, сказав, что pthread.h не найден:

In file included from ../.././gcc/gthr-default.h:1:0,
                 from ../../../combined/libgcc/../gcc/gthr.h:160,
                 from ../../../combined/libgcc/../gcc/unwind-dw2.c:37:
../../../combined/libgcc/../gcc/gthr-posix.h:41:21: fatal error: pthread.h: No such file or directory
compilation terminated.

Итак, есть ли у кого-нибудь инструкции о том, как использовать gcc для создания двоичных файлов Android (я не хочу использовать исходные коды или android-ndk)?

EDIT: мои параметры конфигурации

configure --target=arm-linux-android --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-libssp --disable-libgomp --disable-nls --enable-languages=c,c++,java

Ответы [ 2 ]

3 голосов
/ 03 марта 2013

У меня была точно такая же проблема, как описано dancsi при попытке скомпилировать мои собственные цепочки инструментов кросс-компиляции для Android (я хотел создать 32-битный вариант из них, поэтому ямне не нужно покупать 64-битный ПК или делать вещи для Android в виртуальной машине).

Я использую источники цепочки инструментов из официального репозитория цепочки инструментов AOSP:

repo init -u https://android.googlesource.com/toolchain/manifest

Решение состоит в том, чтобы использовать следующие 2 дополнительных параметра конфигурации: - with-headers и - with-libs .Я получил это решение, прочитав следующий файл: [android-toolchain-repo] / build / README:

Другой способ - указать заголовки и библиотеки с помощью --with-headers и- с библиотекой отдельно.Если вы настроите свое дерево с префиксом.Заголовки и библиотеки будут скопированы в каталог установки, указанный в префиксе.

Для значений этих 2 дополнительных параметров я использовал [android-src-repo] / prebuilts / ndk / 8 / платформы/ android-14 / arch-arm / usr / lib и [android-src-repo] / prebuilts / ndk / 8 / платформы / android-14 / arch-arm / usr / include.[android-src-repo] относится к моей проверке репо базовых источников AOSP (в моем случае я нахожусь на ветке android-4.2.2_r1 этого).

Конечный результат двух конфигурацийМне нужны следующие операторы:

./configure --target=arm-eabi --host=i686-linux-gnu --build=i686-linux-gnu --disable-gold \
    --with-gcc-version=4.6 --with-binutils-version=2.21 --with-gmp-version=4.2.4 --with-mpfr-version=2.4.1 \
    --with-gdb-version=7.3.x --with-gold-version=2.21 --prefix=/tmp/toolchain --disable-multilib \
    --with-libs=/home/boeboe/android-src/prebuilts/ndk/8/platforms/android-14/arch-arm/usr/lib \
    --with-headers=/home/boeboe/android-src/prebuilts/ndk/8/platforms/android-14/arch-arm/usr/include \
    --program-transform-name='s&^&arm-eabi-&' --with-arch=armv5te --disable-option-checking  

./configure --target=arm-linux-androideabi --host=i686-linux-gnu --build=i686-linux-gnu --enable-gold \
    --with-gcc-version=4.6 --with-binutils-version=2.21 --with-gmp-version=4.2.4 --with-mpfr-version=2.4.1 \
    --with-gdb-version=7.3.x --with-gold-version=2.21 --prefix=/tmp/toolchain \
    --with-libs=/home/boeboe/android-src/prebuilts/ndk/8/platforms/android-14/arch-arm/usr/lib \
    --with-headers=/home/boeboe/android-src/prebuilts/ndk/8/platforms/android-14/arch-arm/usr/include \
    --program-transform-name='s&^&arm-linux-androideabi-&' --disable-option-checking

Обратите внимание на дополнительный - параметр отключения-опции-проверки , который был необходим для настройки, чтобы принять все аргументы!

Этодлинный список аргументов был составлен путем проверки исходных аргументов конфигурации, передаваемых для 64-битной версии набора инструментов gcc 4.6.Это можно проверить в файлах SOURCES, доступных в [android-src-repo] /prebuilts/gcc/linux-x86/arm/arm-eabi-4.6 и [android-src-repo] / prebuilts / gcc / linux-x86 /рука / рука-Linux-androideabi-4.6.

В этих же файлах можно найти теги git, поэтому я также извлекаю эти конкретные версии в моем [android-toolchain-repo].Для дополнительных модулей, необходимых gcc, таких как gmp / mpfr / gdb ..., я извлек правильные версии tar-шаров, доступных в [android-toolchain-repo] / gmp | mpfr | gdb.Это был самый простой способ, который я смог выяснить, так как мой исходный оператор конфигурации мог подобрать эти модули.

Тот же метод, который описан выше, также позволил мне скомпилировать 32-битный вариант последней версии gcc 4.7.цепочка инструментов (в настоящее время используется в главном филиале AOSP).Параметры конфигурации в этом случае, конечно, были другими.

1 голос
/ 03 июля 2011
    In file included from ../.././gcc/gthr-default.h:1:0,
                 from /mnt/network/source/gcc/libgcc/../gcc/gthr.h:160,
                 from /mnt/network/source/gcc/libgcc/../gcc/unwind-dw2.c:37:
/mnt/network/source/gcc/libgcc/../gcc/gthr-posix.h:41:21: fatal error: pthread.h: No such file or directory
compilation terminated.
make[2]: *** [unwind-dw2.o] Error 1
make[1]: *** [all-target-libgcc] Error 2
make: *** [all] Error 2

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

    AR=x86_64-w64-mingw32-ar RANLIB=x86_64-w64-mingw32-ranlib
../gcc-4.5.1/configure --prefix=/tools \
--with-local-prefix=/tools --enable-clocale=gnu \
--enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-languages=c,c++ \
--disable-libstdcxx-pch --disable-multilib \
--disable-bootstrap --disable-libgomp \
--without-ppl --without-cloog --build=$MACHTYPE --host=$MACHTYPE --target=x86_64-w64-mingw32

Мой ответ таков: вы знаете, что это не просто Android, проблема более общая, чем просто построение архитектуры ARM. Я думаю, что это проблема c ++, потому что у меня не было проблем с созданием одного компилятора c.

...