我试图交叉编译Freetype 2.5.3,所以我可以将它用于我的Android NDK Opengl ES 2项目,但我不知道该怎么做。我在Windows上使用Cygwin。我已经搜索并阅读了很多关于它的内容,但我仍然需要帮助。
我在cygwin中导出了一些标志:
$ export NDK_TOOLCHAIN=/cygdrive/d/Development/Android/ndk-standalone-15
$ export PATH="$NDK_TOOLCHAIN/bin/:$PATH"
$ export HOST=arm-linux-androideabi
$ export CC=$HOST-gcc
$ export CXX=$HOST-g++
$ export AR=$HOST-ar
$ export LD=$HOST-ld
$ export AS=$HOST-as
$ export NM=$HOST-nm
$ export STRIP=$HOST-strip
$ export RANLIB=$HOST-ranlib
$ export OBJDUMP=$HOST-objdump
$ export CPPFLAGS="--sysroot=$NDK_TOOLCHAIN/sysroot -I$NDK_TOOLCHAIN/sysroot/usr/include -I$NDK_TOOLCHAIN/include"
$ export LDFLAGS="-L$NDK_TOOLCHAIN/sysroot/usr/lib -L$NDK_TOOLCHAIN/lib"
然后我尝试交叉编译freetype:
$ ./configure --with-sysroot=/cygdrive/d/Development/Android/ndk-standalone-15/sysroot --host=$HOST --prefix=/ft2tmp --build=$BUILD --without-zlib --with-png=no
但我收到了一个错误:
FreeType构建系统 - 自动系统检测
使用以下设置:
平台unix编译器
arm-linux-androideabi-gcc配置目录./builds/unix 配置规则./builds/unix/unix.mk如果这与您的系统或设置不符,请删除 文件`config.mk'从该目录中读取INSTALL文件 寻求帮助。
否则,只需输入
make' again to build the library, or
make即可 refdoc'构建API引用(后者需要python)。cd builds / unix; / bin / sh ./configure ' - 与-SYSROOT = / cygdrive / d /开发/ Android设备/ NDK-独立-15 / SYSROOT' ' - 主机=臂-Linux的androideabi' ' - 前缀= / ft2tmp' ' - 构建=' ' - 无需-zlib的' ' - 与-PNG =无'检查构建系统类型... x86_64-unknown-cygwin检查主机系统类型...... arm-unknown-linux-androideabi检查 arm-linux-androideabi-gcc ... arm-linux-androideabi-gcc check C编译器是否正常工作...没有配置:错误:in
/cygdrive/d/Development/tmp/freetype2/builds/unix': configure: error: C compiler cannot create executables See
的config.log'更多细节 builds / unix / detect.mk:86:目标'设置的配方'失败了: * [setup] Error 77
一些config.log文件:
gcc版本4.8(GCC)配置:2925:$? = 0配置:2914: arm-linux-androideabi-gcc -V>& 5 arm-linux-androideabi-gcc.exe:错误: 无法识别的命令行选项' -V' ARM-Linux的androideabi-gcc.exe: 致命错误:没有输入文件编译终止。 configure:2925:$? = 1 configure:2914:arm-linux-androideabi-gcc -qversion>& 5 arm-linux-androideabi-gcc.exe:错误:无法识别的命令行选项 ' -qversion' arm-linux-androideabi-gcc.exe:致命错误:没有输入文件 编译终止。 configure:2925:$? = 1配置:2945: 检查C编译器是否正常工作configure:2967: 臂-Linux的androideabi-GCC --sysroot = / cygdrive / d / Development / Android / ndk-standalone-15 // sysroot -I / cygdrive / d / Development / Android / ndk-standalone-15 // sysroot / usr / include -I / cygdrive / d /开发/ Android / ndk-standalone-15 //包含-L / cygdrive / d /开发/ Android / ndk-standalone-15 // sysroot / usr / lib -L / cygdrive / d /开发/ Android / ndk-standalone-15 // lib conftest.c>& 5 d:/ development / android / ndk-standalone-15 / bin /../ lib / gcc / arm-linux-androideabi / 4.8 /。 ./../../../arm-linux-androideabi/bin/ld.exe: 错误:无法打开crtbegin_dynamic.o:没有这样的文件或目录 d:/开发/机器人/ NDK-独立-15 / bin中/../ LIB / GCC /臂-Linux的androideabi / 4.8 /../../../../臂-Linux的androideabi / bin中/ ld.exe: 错误:无法打开crtend_android.o:没有这样的文件或目录 d:/开发/机器人/ NDK-独立-15 / bin中/../ LIB / GCC /臂-Linux的androideabi / 4.8 /../../../../臂-Linux的androideabi / bin中/ ld.exe: 错误:找不到-lc d:/开发/机器人/ NDK-独立-15 / bin中/../ LIB / GCC /臂-Linux的androideabi / 4.8 /../../../../臂-Linux的androideabi / bin中/ ld.exe: 错误:找不到-ldl collect2.exe:错误:ld返回1退出状态 configure:2971:$? = 1 configure:3009:result:no configure:failed
所以我的问题是我该如何正确地做到这一点?
修改
我在CPPFLAGS和LDFLAGS上使用了unset,并使用带有--with-sysroot标志的./configure,现在它还可以。 下一个问题是当我使用
时make
我收到以下错误:
$ make ./builds/unix/libtool --mode = compile arm-linux-androideabi-gcc -pedantic -ansi -I / cygdrive / d / Development / tmp / freetype2 / objs -I./builds/unix -I / cygdrive / d / Development / tmp / freetype2 / include -c -Wall -g -O2 -DFT_CONFIG_OPTION_SYSTEM_ZLIB - DFT_CONFIG_CONFIG_H ="" -DFT2_BUILD_LIBRARY -DFT_CONFIG_MODULES_H ="" -o /cygdrive/d/Development/tmp/freetype2/objs/ftsystem.lo /cygdrive/d/Development/tmp/freetype2/src/base/ftsystem.c libtool: 编译:arm-linux-androideabi-gcc -pedantic -ansi -I / cygdrive / d / Development / tmp / freetype2 / objs -I./builds/unix -I / cygdrive / d / Development / tmp / freetype2 / include -c -Wall -g -O2 -DFT_CONFIG_OPTION_SYSTEM_ZLIB" - DFT_CONFIG_CONFIG_H =" -DFT2_BUILD_LIBRARY" -DFT_CONFIG_MODULES_H =" /cygdrive/d/Development/tmp/freetype2/src/base/ftsystem.c -fPIC -DPIC -o /cygdrive/d/Development/tmp/freetype2/objs/.libs/ftsystem.o arm-linux-androideabi-gcc.exe:错误: /cygdrive/d/Development/tmp/freetype2/src/base/ftsystem.c:没有这样的 文件或目录arm-linux-androideabi-gcc.exe:致命错误:无输入 文件编译终止。 /cygdrive/d/Development/tmp/freetype2/builds/freetype.mk:207:食谱 for target' /cygdrive/d/Development/tmp/freetype2/objs/ftsystem.lo' 失败了: * [/cygdrive/d/Development/tmp/freetype2/objs/ftsystem.lo]错误1
答案 0 :(得分:6)
您必须设置提供freetype2所在位置的Windows样式路径。以下是如何在您的Windows环境路径中包含您在Android中用于开发的库和文件。您需要为freetype2做同样的事情。
您可能会发现检查这些参考资料很有用:
正如您可能会注意到的,开发Android应用程序的大多数最佳material都在Linux上:
如果您对Android开发非常认真,那么考虑将您的开发转移到Linux平台是值得的。
您还应该查看 OpenGL Getting Started ,它提供了有关如何在Linux,Windows和MacOS上使用OpenGL的几个教程。采用温和的step by step方法可以更有效地成功提高您的OpenGL开发技能。
答案 1 :(得分:3)
当涉及用C编写的库的交叉编译时,我们需要NDK。但是在Windows上编译这种类型的库非常困难,有时会卡住。我建议你在Linux上尝试编译。它肯定会被编译
答案 2 :(得分:1)
NDK for Windows不依赖于Cygwin,更糟糕的是:它无法识别/cygdrive/...
路径。尝试使用D:/Development/tmp/freetype2
。
答案 3 :(得分:0)
首先,准备一个独立的NDK工具链。见https://stackoverflow.com/a/24978903/192373。我使用了以下参数:
bash-3.1$ d:/dev/Android/ndk/build/tools/make-standalone-toolchain.sh --platform=android-14 --toolchain=arm-linux-androideabi-4.8 --system=windows-x86_64 --arch=armv7a
接下来,确保您有/usr/bin/gcc
。
bash-3.1$ ./configure --host=arm-linux-androideabi --prefix=d:/Dev/Android/standalone-toolchain-armv7a-android-17 --without-zlib --with-png=no
最后,我运行make
,我看到了
Directory of d:\dev\freetype-2.5.3\objs\.libs
27/07/2014 10:43 3,462,596 libfreetype.a
27/07/2014 10:43 960 libfreetype.la
27/07/2014 10:43 961 libfreetype.lai
27/07/2014 10:43 2,320,272 libfreetype.so