我手动构建了Android NDK工具链。一切正常,除非我使用编译器时无法找到基本的STL之类的东西。所以它无法编译包含STL的代码,因为默认情况下它不知道在哪里查找头文件。在使用自定义或预建工具链之前,我从未遇到过这个问题。但是,如果我手动添加包含目录,如
-I$(NDK_TOOLCHAIN)/arm-linux-androideabi/include/c++/4.6/
然后它工作得很好。手动添加每个重要的目录是痛苦的(不止这个)。肯定会在这个过程中出现问题。
以下是我为构建它而采取的步骤:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl
Download NDK
Untar NDK to [SOME_LOCATION], using /opt/ndk/
Set NDK_ROOT=/opt/ndk/
./build/tools/download-toolchain-sources.sh src/
Download MPC 0.9
Move mpc tar to ./src/mpc/
./build/tools/build-gcc.sh --gmp-version=4.3.2 --mpc-version=0.9 --mpfr-version=2.4.2 --binutils-version=2.21 $(pwd)/src $(pwd) arm-linux-androideabi-4.6
./build/tools/build-gcc.sh --gmp-version=4.3.2 --mpc-version=0.9 --mpfr-version=2.4.2 --binutils-version=2.21 $(pwd)/src $(pwd) x86-4.6
./build/tools/build-gcc.sh --gmp-version=4.3.2 --mpc-version=0.9 --mpfr-version=2.4.2 --binutils-version=2.21 $(pwd)/src $(pwd) mipsel-linux-android-4.6
所有STL文件都存在于正确的位置。如果我在使用这些自定义构建的工具链作为参考后构建STANDALONE工具链,则每个版本的所有头文件和编译库。
== 更新
强制gcc吐出其包含搜索路径:
echo "#include <bogus.h> int main(){}" > t.c; /opt/android-9_arm/bin/arm-linux-androideabi-gcc -v t.c; rm t.c
这包含一个包含以下内容的搜索路径:
/opt/android-9_arm/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/include
在那个位置确实如下./cxx/4.6/STL_HEADERS
将输出与来自谷歌的NDK版本进行比较确实在严重的地方有所不同。现在真正的问题是如何保证我自定义构建的GCC指向适当的G ++ STL标头位置。
答案 0 :(得分:0)
结果是make-standalone-toolchain.sh中的一个错误。修复是:
mv $NDK_TOOLCHAIN/arm-linux-androideabi/include/c++/4.6 $NDK_TOOLCHAIN/arm-linux-androideabi/include/c++/4.6.x-google
在大多数情况下修复它。但是现在ndkr8b已经发布了官方GCC 4.6支持,这个bug仍然存在(截至2012年7月25日)。有关与独立工具链相关的一些错误的更多详细信息(http://code.google.com/p/android/issues/detail?id=35279)。