如何在Mac OS X上编译通用库?

15

这可能是一个非常愚蠢的问题,但我新手开发Mac并且对通用二进制文件感到困惑。

我有一个应用程序正在QT Creator中编译,根据lipo的输出,它正在产生i386架构的输出。据我了解,这意味着它正在生成Mac OS X 32位输出。

该应用程序依赖于两个外部库。其中一个库我通过先调用./config,然后再运行make来编译。 ./config表明它是"为darwin-i386-cc配置"。但是,在运行make并调用结果的lipo之后,架构被报告为x86_64。

同样,我还有另一个外部库。那个库没有配置脚本,我只需调用make进行编译。这个库的输出也是x86_64。

我如何编译这两个外部库,使它们生成与我的应用程序i386输出兼容的内容?更好的是,我如何编译这两个外部库以生成通用库,以便我可以从我的应用程序生成通用二进制文件,并在32位和64位上工作?

此外,基于Mac世界的当前状态,是否有其他平台需要我针对性地创建一个合适的用户友好型Mac OS X通用二进制?

3个回答

14

最终搞定了。

为了控制目标系统的架构,我手动进入并编辑了Makefiles。

对于其中一个,我在以CFLAGS开头的行的末尾添加了-arch i386 -arch x86_64 -arch ppc。这样就生成了通用二进制文件。

对于另一个,当我做同样的操作时,编译会出错。我不得不逐个进行架构设置,先只放置一个架构,然后生成三个单独的版本。最后,我使用-create标志调用lipo命令将它们合并成通用二进制文件。


你知道这是否也适用于添加iOS支持吗? - tofutim
这个通用库是什么,它只是所有不同编译的压缩吗?那么你最终会得到一个巨大的库吗? - tofutim

8

对于./configure,您可以使用以下内容:

./configure CFLAGS="-arch i386 -arch x86_64" CXXFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64" --disable-dependency-tracking

--disable-dependency-tracking很重要,否则gcc/g++会拒绝编译代码。


1

我无法回答你问题的主要部分,因为我总是使用Xcode而不是Make。但是就最后一部分而言,如果您支持早于10.6的操作系统版本,则可能还需要编译PowerPC(arch.代码“ppc”)。


PowerPC构建是Mac消费市场的重要组成部分吗?所以,预计将会有3个平台支持通用二进制文件? - Nantucket
1
我不知道具体的百分比,但我仍然支持PowerPC,并且我认为许多其他产品也是如此。由于我的产品部分使用Carbon,因此我还不支持64位。但是,如果您现在正在开发新产品,只选择Intel也不是不合理的。考虑您的市场:某些领域(如教育)可能会比其他领域更长时间地使用旧硬件。 - JWWalker
1
还有一件事:据我所知,“通用二进制”一词通常指i386+ppc,而不是i386+x86_64。 - JWWalker
1
nantucket: 大约有10%到40%的Mac用户使用PPC电脑。然而,我怀疑作为“主要机器”使用的PPC数量将不到10%。 - Coxy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接