【问题标题】:How to build i686-linux-android-gfortran for android-ndk8b (x86 arch Android)?如何为 android-ndk8b(x86 arch Android)构建 i686-linux-android-gfortran?
【发布时间】:2012-08-12 12:54:05
【问题描述】:

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

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

【问题讨论】:

  • 感谢使用 Fortran 定位移动设备操作系统 :)
  • 在尝试 gfortran 之前,您是否成功构建了 gcc 的 c 编译器部分?
  • 我的建议是尝试构建 c 编译器(即使它已经可用),因为这将帮助您解决许多可能众所周知的问题(并且可能更容易获得帮助) ,在您担心这些特定于 fortran 的问题之前。
  • 我不确定您是否可以选择一个名为 link.h 的随机头文件并希望它能正常工作,如果它说找不到尝试在树中搜索,如果没有注释掉包含并查看它真的错过了,然后谷歌寻找失踪的类型
  • 为了人们寻找答案并到达这里:groups.google.com/d/msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ

标签: android gcc x86 fortran


【解决方案1】:

来自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 使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多