如何为android-ndk8b(x86 arch android)构建i686 linux android gfort



我尝试使用build-gcc.sh构建i686 linux android gfortran(这是针对androdindk-7b的)但我收到了关于link.h的错误。我从这里添加了link.h,但它给出了更多的错误。

有人尝试过为x86安卓系统启用i686 linux安卓gfortran吗?

来源https://groups.google.com/forum/#!消息/android ndk/QR1qiN0jIpE/g0MHkhTd4YMJ,如selalerer所建议。我没有尝试过,所以我以社区维基的形式发布,以供参考。

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

本指南基于此,非常感谢菲尔:使用Objective-C-enabled gcc错误编译Android NDK

1) 下载并解压Android NDK"Android-NDK-r8c",(旧的-r8b NDK由于缺少链接而无法工作。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.223.tar.gztar-xvzf binutils-2.223.tar.gz您现在应该有一个文件夹工具链src/binutils/binutils-2.23

5) 更改为文件夹工具链src/build,编辑Makefile.in,更改行:--使用gnu as——使用gnu ld——启用语言=c,c++到--使用gnu as——使用gnu ld——启用语言=c,c++,fortran

6) 在文件android-ndk-r8c/build/tools/build-mingw64-toolchain.sh中,更改行:var_append GCC_CONFIGURE_OPTIONS"--启用语言=c,c++"到var_append GCC_CONFIGURE_OPTIONS"--启用语言=c,c++,fortran">

7) 在文件android-ndk-r8c/build/tools/build-gcc.sh中,更改行:EXTRA_CONFIG_FLAGS=$EXTRA_COONFIG_FLAGS"--禁用libquadmath--禁用插件"到EXTRA_CONFIG_FLAGS=$EXTRA_COONFIG_FLAGS"--禁用libquadmath--禁用libquadmath支持--禁用插件">

8) 在文件android-ndk-r8c/build/tools/build-host-gcc.sh中,更改行:ARGS=$ARGS"--启用语言=c,c++"到ARGS=$ARGS"--启用语言=c、c++、fortran"并更改线路ARGS=$ARGS"--禁用libquadmath--禁用插件--禁用libitm--禁用引导程序"到ARGS=$ARGS"--禁用libquadmath--禁用libquadmath支持--禁用插件--禁用libitm--禁用引导程序">

9) 构建新的工具链:/你的/path/to/android-ndk-r8c/build/tools/build-gcc.sh-j1-gmp版本=5.0.5--mpfr版本=2.4.2--mpc版本=0.8.1--binutils版本=2.23--gdb版本=7.3.x/your/path/to_toolchain src/your/path_to/android-ndk-r8c x86-4.7(不要担心诸如"expr:warning:unportable BRE:"之类的消息)

10) 跪在屏幕前,向上帝祈祷无数的配置脚本使用丑陋的shell语言进行无人需要的检查通过从右到左的压痕烹饪你的大脑,会以某种方式设法编译大量太小的文件(因此10%的时间都花在了编译上以及启动GCC时的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/pre-builded/linux-x86/i686-linux-android"并运行此命令:在/libexec如果没有此命令,g++可能会引发错误消息"g++:致命错误:-fuse链接器插件,但找不到liblto_plugin.so"。使用strace,我发现g++看起来在错误的文件夹中,但链接尽管如此,上面让它可以找到文件liblto_plugin.so。

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

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

*)出现错误消息"GCC_NO_EXECUTABLES之后不允许进行链接测试"当x86链接失败时(适用于ARM)。原因是GCC不包括来自的正确ANDROID_STARTFILE_SPEC和ANDROID_ENDFILE_SPECgcc-4.6.1/gcc/config/linux-android.h。gcc 4.6.1只为ARM指定了它们,而没有然而,对于i386,GCC 4.8.0确实如此。从谷歌下载的GC也有,所以最好使用谷歌的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.htmlMIPS在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也会出现这种情况,所以我们可以继续使用谷歌的gcc-4.7。Google本身使用--disable libquadmath,但我们还需要--disable librquadmathsupport(参见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版本时,最好留在谷歌的GC。

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

*)如果在编译通用的morestack.c时出现错误,请替换#ifdeflinux//在linux上,前两个实时信号由NPTL使用具有#如果已定义(GLIBC)&已定义(linux)//在Linux上,NPTL 使用前两个实时信号

最新更新