如何为android-ndk8b(x86 arch Android)构建i686-linux-android-gfortran?

sol*_*lti 40 x86 android gcc fortran

我试着用build-gcc.sh建设的i686-Linux的Android平台的gfortran下面这个 (它是androdindk-7B),但我得到link.h.错误 我从这里添加了link.h ,但它提供了更多的错误.

有没有人尝试为x86 Android启用i686-linux-android-gfortran?

Cha*_*ski 1

正如卖家建议的,来自https://groups.google.com/forum/#!msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ。我没有尝试过这个,所以我将其发布为社区维基以供参考。

Fortran for x86 Android =================

该指南基于此指南,非常感谢 Phil: Compiling Android NDK with Objective-C-enabled gccErrors

1) 下载并解压 Android NDK 'android-ndk-r8c',(由于缺少 link.h,旧的 -r8b NDK 将无法工作!): wget http://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
Run Code Online (Sandbox Code Playgroud)

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++: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found”。使用 strace,我发现 g++ 在错误的文件夹中查找,但上面的链接让它找到文件 liblto_plugin.so 。

以下是在 Google 找到此页面时学到的一些经验教训:

*) 为了加快编译速度,您可以删除'-j1'。但只有在你让它工作一次之后,因为据报道在多个 CPU 核心上并行构建会导致额外的麻烦。

*) 当 x86 链接失败时(适用于 ARM),会显示错误消息“GCC_NO_EXECUTABLES 之后不允许链接测试”。原因是 GCC 不包含 gcc-4.6.1/gcc/config/linux-android.h 中正确的 ANDROID_STARTFILE_SPEC 和 ANDROID_ENDFILE_SPEC。GCC 4.6.1 只为 ARM 指定了它们,但没有为 i386 指定,但 GCC 4.8.0 却指定了。从 Google 下载的 GCC 也可以,所以最好使用 Google 的 GCC。

*)错误消息“致命错误:link.h:没有这样的文件或目录”也会发生在Google的GCC上,并且显然(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50877)仅当您可以启用其他语言,例如 objc 或 fortran。bug线程在这里:http://gcc.gnu.org/ml/gcc-bugs/2012-08/msg00494.html MIPS在android-ndk-r8b/platforms/android-9/arch-mips中有link.h /usr/include 在 android-ndk-r8c 中,link.h 现在也存在于 android-9/arch-x86/usr/include/link.h 中,因此此错误已修复。

*) 错误消息“致命错误:quadmath_weak.h:没有这样的文件或目录”:最新的 gcc-4.8 也会出现这种情况,因此我们可以继续使用 Google 的 GCC 4.7。Google 本身使用 --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 中添加

*) 错误消息“error: Pthreads are required to build libatomic”发生在构建从 gnu.org 下载的 ARM 版本的 gcc-4.8 时,最好还是使用 Google 的 GCC。

*) android-ndk-r8c 附带的 GCC 对我不起作用(有关 libstdc++.so.6 太旧的错误消息),而 android-ndk-r8b 中的 GCC 工作没有问题。由于 android-ndk 应该支持尽可能多的环境,我不确定为什么 Google 员工决定依赖更新的 libstdc++,但好消息是构建自己的工具链可以解决这个问题。

*) 如果编译 generic-morestack.c 时出现错误,则替换 #ifdef linux // 在 Linux 上,前两个实时信号由 NPTL 使用 #if Defined( GLIBC ) && Defined( linux ) //在 Linux 上,前两个实时信号由 NPTL 使用