如何为 Android NDK8b(x86 架构 Android)构建 i686-linux-android-gfortran?

41
我尝试使用build-gcc.sh构建i686-linux-android-gfortran,按照this(适用于androdindk-7b)的说明操作,但是我遇到了关于link.h的错误。我从here添加了link.h,但是它引发了更多的错误。
有人尝试启用i686-linux-android-gfortran以支持x86 Android吗?

10
感谢使用Fortran针对移动设备操作系统的尝试 :) - Hristo Iliev
在尝试gfortran之前,您是否成功构建了GCC编译器的部分工作? - DaveP
2
我的建议是尝试构建C编译器(即使它已经存在),因为这将帮助您解决许多可能已知的问题(并且可以更容易地获得帮助),然后再担心那些与Fortran特定问题相关的问题。 - DaveP
3
我不确定你能够随意选择一个名为link.h的头文件并期望它能正常工作。如果出现“未找到”的情况,请尝试在目录中搜索该文件。如果仍然无法找到,请将include语句注释掉,查看缺少了哪些内容,并在谷歌上搜索缺失的类型。 - sherpya
1
为了那些正在寻找答案并到达此处的人:https://groups.google.com/d/msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ - selalerer
显示剩余2条评论
1个回答

1

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

x86 Android上的Fortran =================

此指南基于Phil的指南,特此鸣谢: 使用启用了Objective-C的gcc编译Android NDK时出错

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文件夹内),进入这个新文件夹

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',进入该目录,解压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++,fortran" 而不是 var_append GCC_CONFIGURE_OPTIONS "--enable-languages=c,c++"

7) 在文件android-ndk-r8c/build/tools/build-gcc.sh中,将以下行更改为: EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libquadmath --disable-libquadmath-support --disable-plugin" 而不是 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libquadmath --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) 然后跪在屏幕前,祈求上帝让这些无数的配置脚本能够编译过多的文件(好让90% 的时间都用于启动 GCC,只有 10% 用于编译),而不是一遍又一遍地检查没有必要的内容,使用一个丑陋的 shell 语言、让缩进从右到左折磨你的大脑。一小时之后,在通过 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工作),出现错误消息“Link tests are not allowed after 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。

*) 当你启用其他语言(如objc或fortran)时,谷歌的GCC也会出现“致命错误:link.h:没有那个文件或目录”的错误消息。 显然这个问题只在特定情况下发生(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50877)。 该bug线程位于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中出现,因此已经修复了此错误。

*) 错误信息“fatal error: quadmath_weak.h: 没有这个文件或目录”: 这也发生在最新的gcc-4.8上,因此我们可以继续使用谷歌的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。

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

*) 我使用的android-ndk-r8c自带的GCC无法工作(显示libstdc++.so.6版本过旧的错误信息),而android-ndk-r8b自带的可以正常使用。由于android-ndk应该支持尽可能多的环境,我不确定Google员工为什么决定依赖更新的libstdc++,但好消息是构建自己的工具链可以解决这个问题。

*) 如果在编译generic-morestack.c时遇到错误,则将#ifdef linux替换为#if defined(GLIBC) && defined(linux),因为在Linux上,前两个实时信号被NPTL使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接