来自https://groups.google.com/forum/#!msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ,正如卖家建议的那样。我没有尝试过,因此我将其作为社区 wiki 发布以供参考。
适用于 x86 Android 的 Fortran
=================
本指南基于此指南,非常感谢 Phil:
Compiling Android NDK with Objective-C-enabled gcc errors
1) 下载并解压 Android NDK 'android-ndk-r8c',(旧的 -r8b NDK 由于缺少 link.h 将无法工作!):
wgethttp://dl.google.com/android/ndk/android-ndk-r8c-linux-x86.tar.bz2
2) 在某处创建一个名为“toolchain-src”的文件夹(例如,在文件夹 android-ndk-r8c 内),
'cd' 到这个新文件夹
3) 确保已安装 git ('yum install git' 或其他任何东西..) 并下载
工具链来源:
git clone https://android.googlesource.com/toolchain/build.git
git clone https://android.googlesource.com/toolchain/gmp.git
git clone https://android.googlesource.com/toolchain/gdb.git
git clone https://android.googlesource.com/toolchain/mpc.git
git clone https://android.googlesource.com/toolchain/mpfr.git
git clone https://android.googlesource.com/toolchain/expat.git
4) 在这个目录下创建文件夹'binutils', 'cd',解压
binutils-2.23 那里:
wget ftp.gnu.org/gnu/binutils/binutils-2.23.tar.gz
tar -xvzf binutils-2.23.tar.gz
您现在应该有一个文件夹 toolchain-src/binutils/binutils-2.23
5) 更改文件夹 toolchain-src/build,编辑 Makefile.in,更改行:
--with-gnu-as --with-gnu-ld --enable-languages=c,c++
到
--with-gnu-as --with-gnu-ld --enable-languages=c,c++,fortran
6) 在文件 android-ndk-r8c/build/tools/build-mingw64-toolchain.sh 中更改以下行:
var_append GCC_CONFIGURE_OPTIONS "--enable-languages=c,c++"
到
var_append GCC_CONFIGURE_OPTIONS "--enable-languages=c,c++,fortran"
7) 在文件 android-ndk-r8c/build/tools/build-gcc.sh 中,更改以下行:
EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libquadmath --disable-plugin"
到
EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libquadmath --disable-libquadmath-support --disable-plugin"
8) 在文件 android-ndk-r8c/build/tools/build-host-gcc.sh 中,更改以下行:
ARGS=$ARGS" --enable-languages=c,c++"
到
ARGS=$ARGS" --enable-languages=c,c++,fortran"
并换行
ARGS=$ARGS" --disable-libquadmath --disable-plugin --disable-libitm --disable-bootstrap"
到
ARGS=$ARGS" --disable-libquadmath --disable-libquadmath-support --disable-plugin --disable-libitm --disable-bootstrap"
9) 构建您的新工具链:
/your/path/to/android-ndk-r8c/build/tools/build-gcc.sh -j1 --gmp-version=5.0.5 --mpfr-version=2.4.2 --mpc-version=0.8。 1 --binutils-version=2.23 --gdb-version=7.3.x /your/path/to/toolchain-src /your/path/to/android-ndk-r8c x86-4.7
(不要担心像'expr: warning: unportable BRE:'这样的消息)
10) 在屏幕前跪下,向上帝祈祷,不知怎的,这些
无数的配置脚本使用丑陋的 shell 语言进行没人需要的检查
用从右到左的压痕来烹饪你的大脑,会以某种方式设法
编译无数个太小的文件(因此 10% 的时间花在编译上
和 90% 用于启动 GCC),并且在观察了一个小时的进度后
tail -F /tmp/ndk-YourUserName/build/toolchain/config.log
您的工具链将神奇地准备就绪。您可以在 android-ndk-r8c/toolchains 文件夹中找到它。
11) 最后,“cd”到文件夹
'/your/path/to/android-ndk-r8c/toolchains/x86-4.7/prebuilt/linux-x86/i686-linux-android'
并运行此命令:
ln -s ../libexec libexec
如果没有此命令,g++ 可能会引发错误消息
“g++:致命错误:-fuse-linker-plugin,但未找到 liblto_plugin.so”。
使用 strace,我发现 g++ 在错误的文件夹中查找,但是链接
上面让它找到了文件 liblto_plugin.so。
这里有一些经验教训,以便谷歌找到这个页面:
*) 为了加快编译速度,你可以去掉'-j1'。但只有在你得到
它可以工作一次,因为据报道在多个 CPU 内核上并行构建
造成额外的麻烦。
*) 出现错误消息“GCC_NO_EXECUTABLES 后不允许链接测试”
当 x86 链接失败时(适用于 ARM)。原因是 GCC 不包括
正确的 ANDROID_STARTFILE_SPEC 和 ANDROID_ENDFILE_SPEC 来自
gcc-4.6.1/gcc/config/linux-android.h。 GCC 4.6.1 只为 ARM 指定它们,但没有
对于 i386,GCC 4.8.0 可以。从 Google 下载的 GCC 也可以,
所以最好使用 Google 的 GCC。
*) 错误信息“fatal error: link.h: No such file or directory”也会发生
使用 Google 的 GCC,显然 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50877)
仅当您启用 objc 或 fortran 等其他语言时。
错误线程在这里:http://gcc.gnu.org/ml/gcc-bugs/2012-08/msg00494.html
MIPS 在 android-ndk-r8b/platforms/android-9/arch-mips/usr/include 中有 link.h
在 android-ndk-r8c 中,link.h 现在也存在于 android-9/arch-x86/usr/include/link.h 中,
所以这个bug被修复了。
*) 错误信息“fatal error: quadmath_weak.h: No such file or directory”:
最新的 gcc-4.8 也会出现这种情况,因此我们可以继续使用 Google 的 GCC 4.7。
谷歌本身使用--disable-libquadmath,但我们还需要--disable-libquadmathsupport
(见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47648)。所以这个需要加入
android-ndk-r8c/build/tools/build-gcc.sh
和
android-ndk-r8c/build/tools/build-host-gcc.sh
*) 错误消息“错误:Pthreads are required to build libatomic”
在构建从 gnu.org 下载的 ARM 版本的 gcc-4.8 时发生,
更好地使用 Google 的 GCC。
*) android-ndk-r8c 附带的 GCC 对我不起作用(关于
libstdc++.so.6 太旧了),而 android-ndk-r8b 中的那个有效
没有什么问题。由于 android-ndk 应该支持尽可能多的环境
尽可能,我不确定 Google 员工为什么决定依赖更新的 libstdc++,
但好消息是构建自己的工具链可以解决问题。
*) 如果在编译 generic-morestack.c 时遇到错误,请替换
#ifdef Linux
// 在 Linux 上,前两个实时信号由 NPTL 使用
和
#if 定义(GLIBC) && 定义(linux)
// 在 Linux 上,前两个实时信号由 NPTL 使用