Iphone 交叉编译Makefile:处理测试程序

Iphone 交叉编译Makefile:处理测试程序,iphone,gcc,makefile,cross-compiling,configure,Iphone,Gcc,Makefile,Cross Compiling,Configure,我正在尝试交叉编译几个从OSX到iOS的库。我已经成功地交叉编译了libjpeg和libogg 但是我不能编译libvorbis,因为configure坚持创建并运行一个小测试程序。这显然失败了,因为它创建了一个armv7二进制文件,无法运行它,然后将其解释为缺少ogg库 你通常如何处理这类问题?我试图破解configure脚本来解决这些问题,但是由于这种失败,一些功能可能会被禁用。我还考虑让配置生成一个本地Makefile,然后将其转换为使用iOS工具链,但这似乎太容易出错 有什么建议吗?如果

我正在尝试交叉编译几个从OSX到iOS的库。我已经成功地交叉编译了libjpeg和libogg

但是我不能编译libvorbis,因为
configure
坚持创建并运行一个小测试程序。这显然失败了,因为它创建了一个
armv7
二进制文件,无法运行它,然后将其解释为缺少ogg库

你通常如何处理这类问题?我试图破解configure脚本来解决这些问题,但是由于这种失败,一些功能可能会被禁用。我还考虑让
配置
生成一个本地Makefile,然后将其转换为使用iOS工具链,但这似乎太容易出错


有什么建议吗?

如果您交叉编译的依赖项比libc(glibc)多,那么它会变得复杂得多。您需要已经交叉编译了所有依赖项。交叉编译器工具链和所有辅助构建程序和脚本都需要知道如何找到这些依赖项(交叉编译的库和头)

您需要已经交叉编译libogg(及其依赖项)并将它们安装到交叉编译根目录中。生成系统中的标头和库不能用于主机(arm7)系统。它们必须分开存放

此外,如果您想要共享对象库(*.so),而不仅仅是静态库,那么会有一整套新的复杂问题。例如,虽然交叉编译器工具链包含交叉编译的libc作为工具链的一部分,但主机系统仍然需要libc。作为工具链一部分的libc可以用于此目的,但其结构方式与主机系统不同。有时人们复制并重新排列文件,但通常人们只是为根目录编译并安装一个新的glibc

总之,您看到的两个错误是因为configure脚本无法找到交叉编译的libogg库。如果还没有,则需要交叉编译libogg(和依赖项),并将它们安装到目标根目录中。然后,您需要告诉配置脚本交叉编译的头(是的,头是特定于体系结构的)和库在目标根目录中的位置。通常使用CFLAGS、LDFLAGS、cxflags等(不是--prefix),但可能还需要设置其他环境变量,以影响pkg config等内容。在构建每个依赖项之后,需要获取makefile以将依赖项安装到根目录。通常这是通过
make DESTDIR=[root]安装来完成的,但是一些makefile有自己的机制(或者没有合适的替代安装机制)

您可能还需要覆盖某些编写不好且没有良好交叉编译默认值的配置检查(使用环境变量)。这些变量通常以ac_cv开头_*

因此,基本流程是对您需要的包执行此操作(按依赖顺序):


祝你好运。一旦你对标准的交叉编译感到满意,那么你就准备好接受真正的黑色艺术;-)

我终于明白了。我通过显式地使它链接到ogg(
LDFLAGS=“/usr/local/ios/lib/libogg-armv7.a”。/configure…
)来欺骗
configure
,然后从生成的makefile中删除对库的显式引用。

检查oggpackB\u读取。。。无配置:错误:更新的libogg版本(1.1或更高版本)requiredconfig.log显示ld:warning:directory'${exec_prefix}/lib'following-L未找到ld:warning:in/usr/local/lib/libogg.dylib,文件是为i386构建的,它不是要链接的体系结构(armv7),而是试图链接到/usr/local/lib而不是/usr/local/ios/lib,虽然我已经正确地设置了每个标志:SThanks for all the info:)事实上,很长一段时间以来,我一直使用mingw环境从Linux交叉编译Windows二进制文件,但我从未遇到过这个问题。有三件事:首先,你滥用LDFLAGS来附加到链接行(即,指定完整路径并不是真正的LD标志). 更正确的方法是LDFLAGS=“-L/usr/local/ios/lib”。其次,您的解决方案只是我建议的一个更具体的例子(即,一旦您尝试构建其他东西,它就会崩溃)。即/usr/local/ios是我提到的目标根目录。第三,如果信息对你有用,但不是一个足够的答案,你可以考虑投票给我的答案。谢谢。@kanaka,谢谢你的评论;我刚刚对你的答案投了赞成票。至于问题本身,传递-L是我尝试的第一件事,但没有任何效果-configure一直试图链接到系统范围的ogg(可能是因为动态库优先于静态库,我不知道)。我知道这是一个黑客行为,但在我必须交叉编译的所有库中,这是唯一一个有问题的库,我没有打算也没有时间深入研究配置内部。是的,这是合理的。autoconf(尤其是libtool)在处理库路径解析的方式上可能相当不透明。如果您希望构建更多的库和/或应用程序,而不是简单的依赖关系,那么您可能希望跟踪问题。如果只是一次性的,那就做任何有效的事情。
export CFLAGS=-I[root]/usr/include LDFLAGS=-L[root]/usr/lib CXXFLAGS=-I[root]/usr/include
export ac_cv_[test1]=[yes|no] ac_cv_[test2]=[yes|no] ...
./configure --host=[arm7-blah-blah]
make
make DESTDIR=[root] install