40

我尝试在此之后使用 build-gcc.sh 构建 i686-linux-android-gfortran (它适用于 androdindk-7b),但我收到有关 link.h 的错误。我从这里添加了 link.h ,但它提供了更多错误。

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

4

1 回答 1

1

来自https://groups.google.com/forum/#!msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ作为 selalerer 建议。我没有尝试过,所以我将其作为社区 wiki 发布以供参考。

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

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

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

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-libtm --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)然后跪在屏幕前,向上帝祈祷,这些无数的配置脚本以某种方式进行没人需要的检查,使用一种丑陋的外壳语言,用从右到左的缩进来烹饪你的大脑,以某种方式管理编译大量太小的文件(因此 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。

这里有一些经验教训,以便谷歌找到这个页面:

*) 要加快编译速度,您可以删除“-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:没有这样的文件或目录”也发生在谷歌的 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 中有 link.h /usr/include 在 android-ndk-r8c 中,link.h 现在也存在于 android-9/arch-x86/usr/include/link.h 中,因此已修复此错误。

*) 错误消息“fatal error: quadmath_weak.h: No such file or directory”:最新的 gcc-4.8 也会出现这种情况,因此我们可以继续使用 Googles 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 使用前两个实时信号

于 2014-04-28T21:56:41.213 回答