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

时间:2011-03-31 15:03:10

标签: iphone gcc makefile cross-compiling configure

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

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果你是交叉编译任何依赖性比libc(glibc)更多的东西,那就变得复杂得多。您需要已经交叉编译了所有依赖项。交叉编译工具链和所有帮助程序构建程序和脚本需要知道如何找到这些依赖项(交叉编译的库和头文件)。

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

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

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

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

开头

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

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
祝你好运。一旦您对标准交叉编译感到满意,那么您将准备好接受真正的黑色艺术,Canadian cross; - )

答案 1 :(得分:1)

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