我尝试使用this之后的build-gcc.sh构建i686-linux-android-gfortran (这是针对androdindk-7b)但是我收到有关link.h的错误。我从here添加了link.h,但它提供了更多错误。
有没有人尝试为x86 Android启用i686-linux-android-gfortran?
答案 0 :(得分:1)
来自https://groups.google.com/forum/#!msg/android-ndk/QR1qiN0jIpE/g0MHkhTd4YMJ的selalerer建议。我没试过这个,所以我发布社区维基作为参考目的。
Fortran for x86 Android =================
该指南基于此指南,非常感谢Phil: Compiling Android NDK with Objective-C-enabled gcc errors
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
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语言= C,C ++" 至 ARGS = $ ARGS" --enable语言= 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:警告:不可移植的BRE:')
10)在屏幕前跪下,向主祈祷,不知怎的 无数的配置脚本使用丑陋的shell语言执行无人需要的检查 通过从右到左的缩进来烹饪你的大脑,将以某种方式设法 编译了太多太小的文件(因此10%的时间花在编译上 并且90%在启动海湾合作委员会),并在观察进展一小时后 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。
以下是一些经验教训,以便Google找到此页面:
*)为了加快编辑速度,您可以删除' -j1'。但只有在你得到之后 它工作一次,因为报告了在多个CPU核心上并行构建 引起额外麻烦。
*)GCC_NO_EXECUTABLES"之后不允许出现错误消息"链接测试出现 当x86链接失败时(适用于ARM)。原因是海湾合作委员会不包括 来自的正确的ANDROID_STARTFILE_SPEC和ANDROID_ENDFILE_SPEC GCC-4.6.1 / GCC /配置/ Linux的android.h。 GCC 4.6.1仅为ARM指定它们,但不是 对于i386,GCC 4.8.0却可以。从谷歌下载的GCC也可以, 所以最好使用谷歌的GCC。
*)错误消息"致命错误:link.h:没有这样的文件或目录"也发生了 与谷歌的海湾合作委员会,显然(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中, 所以这个错误已得到修复。
*)错误消息"致命错误:quadmath_weak.h:没有这样的文件或目录": 它也适用于最新的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-gcc.sh 和 机器人-NDK-R8C /建造/工具/ build-host-gcc.sh
*)错误消息"错误:Pthreads是构建libatomic" 在构建从gnu.org下载的ARM版gcc-4.8时会发生, 更好地留在谷歌的海湾合作委员会。
*)android-ndk-r8c附带的GCC对我不起作用(关于 libstdc ++。so.6太老了),而android-ndk-r8b中的那个工作了 没有问题。因为android-ndk应该支持尽可能多的环境 尽可能地,我不确定为什么Google员工决定依赖更新的libstdc ++, 但好消息是,构建自己的工具链可以解决问题。
*)如果在编译generic-morestack.c时出错,则替换 #ifdef linux //在Linux上,NPTL使用前两个实时信号 同 #if defined( GLIBC )&&定义(的的Linux 强>) //在Linux上,NPTL使用前两个实时信号