2011-06-16 77 views
2

我讀過gcc文檔,它支持使用-mandroid和-mbionic開關構建android二進制文件。首先,我使用從svn構建的本地gcc進行了嘗試。結果:如何配置gcc爲android編譯?

[email protected]:~$ 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) 
[email protected]:~$ g++ test.cpp -mandroid -o test.out 
[email protected]:~$ 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(不定義sysroot,...)編譯相同的gcc源代碼,並且它通過了配置,但是未能構建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 

回答

3

我必須完全按照dancsi描述,而試圖編譯我自己的交叉編譯工具鏈爲Android同樣的問題(我想建立一個32位變種人所以我並不需要買64位電腦或做我的android的東西在一個虛擬機)。

我使用的工具鏈來源從官方AOSP工具鏈回購:

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

的解決方法是使用下面的2個額外的配置選項:--with-頭--with -libs。我通過閱讀下列文件得到這個解決方案:Android的工具鏈回購] /建設/ README:

另一種方式是指定頭文件和庫用--with-header和 - 與-libs分開。如果你用一個前綴來配置你的樹。標題 和庫將被複制到由前綴指定的安裝目錄中。

對於那些2個額外的參數的值我使用的機器人-SRC-回購]/prebuilts/NDK/8 /平臺/機器人-14 /弓形臂的/ usr/lib和[機器人-SRC-回購]/prebuilts/NDK/8 /平臺/機器人-14 /弓形臂的/ usr /包括。 [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 

注意額外的- 禁用選項檢查參數,它是必要的配置爲接受所有的參數!

這個冗長的參數列表是通過檢查爲4.6 gcc工具鏈的默認64位版本傳遞的原始配置參數構建的。這可以在[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 ...,我提取了[android-toolchain-repo]/gmp | mpfr | gdb中可用的正確版本的tar-balls。這是我能找到的最簡單的方法,因爲我的原始配置語句能夠獲取這些模塊。

與上述相同的技術也允許我編譯最新的gcc 4.7工具鏈(目前正在AOSP的MAIN分支上使用)的32位變體。在這種情況下,配置選項當然是不同的。

1
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編譯器時沒有問題。

+0

我可能找到了一些可以幫助你的東西。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0483c/CIHDHBDG.html – Whitequill 2011-07-03 03:35:56

+0

現在很高興知道:)我將嘗試構建Linux(x64)以windows(x86_64-w64-mingw32),並將回報= ... – dancsi 2011-07-03 10:33:29