【问题标题】:How to configure gcc to compile for android?如何配置 gcc 为 android 编译?
【发布时间】:2011-06-16 10:03:21
【问题描述】:

我在 gcc 文档中读到它支持使用 -mandroid 和 -mbionic 开关构建 android 二进制文件。首先,我尝试使用从 svn 构建的本机 gcc。结果:

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

基本上,它失败了。接下来,我尝试使用 target=arm-linux-androideabi 编译相同的 gcc 源代码(没有定义 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)吗?

编辑: 我的配置选项

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

【问题讨论】:

    标签: android gcc android-ndk


    【解决方案1】:

    我在尝试为 Android 编译我自己的交叉编译工具链时遇到了与 dancsi 描述的完全相同的问题(我想构建一个 32 位变体所以我不需要购买 64 位 PC 或在 VM 中做我的 android 工作)。

    我正在使用来自官方 AOSP 工具链 repo 的工具链来源:

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

    解决方案是使用以下 2 个额外的配置选项:--with-headers--with-libs。我通过阅读以下文件得到了这个解决方案:[android-toolchain-repo]/build/README:

    另一种方法是使用 --with-headers 和 --with-libs 分开。如果您使用前缀配置树。标头 并且库将被复制到前缀指定的安装目录中。

    对于这两个额外参数的值,我使用了 [android-src-repo]/prebuilts/ndk/8/platforms/android-14/arch-arm/usr/lib 和 [android-src-repo]/prebuilts /ndk/8/platforms/android-14/arch-arm/usr/include. [android-src-repo] 指的是我对基本 AOSP 源的 repo 结帐(在我的情况下,我在它的 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
    

    注意额外的 --disable-option-checking 参数,这是 configure 接受所有参数所必需的!

    这个长长的参数列表是通过检查为 4.6 gcc 工具链的默认 64 位版本传递的原始配置参数而构建的。这可以在 [android-src-repo]/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6 和 [android-src-repo]/prebuilts/gcc/linux-x86/ 中的 SOURCES 文件中进行检查手臂/arm-linux-androideabi-4.6。

    在相同的文件中,可以找到 git 标签,所以我也在我的 [android-toolchain-repo] 中检查了这些特定版本。对于 gcc 所需的额外模块,例如 gmp/mpfr/gdb...,我提取了 [android-toolchain-repo]/gmp|mpfr|gdb 中可用的正确版本的 tar-ball。这是我能找到的最简单的方法,因为我的原始配置语句能够获取这些模块。

    与上述相同的技术还允许我编译最新的 gcc 4.7 工具链的 32 位变体(目前在 AOSP 的 MAIN 分支上使用)。在这种情况下,配置选项当然是不同的。

    【讨论】:

      【解决方案2】:
          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 编译器时遇到了/没有问题。

      【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多