【问题标题】:How to compile universal libraries on Mac OS X?如何在 Mac OS X 上编译通用库?
【发布时间】:2011-03-21 23:25:54
【问题描述】:

这可能是一个非常愚蠢的问题,但我是在 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 通用二进制文件?

【问题讨论】:

    标签: macos compilation universal-binary


    【解决方案1】:

    终于搞定了。

    为了控制目标的架构,我手动进去编辑了Makefiles。

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

    另一方面,当我做同样的事情时,编译会出错。我不得不循环,一次只放一个拱门,然后在我制作完所有三个拱门后,我用 -create 标志对它们调用 lipo 以创建一个通用二进制文件。

    【讨论】:

    • 你知道这是否也适用于添加 iOS 支持
    • 啊这个通用库是什么,它只是将所有不同的编译压缩在一起吗?那么你最终会拥有一个巨大的图书馆吗?
    【解决方案2】:

    对于./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++ 将拒绝编译代码。

    【讨论】:

      【解决方案3】:

      我无法回答您问题的主要部分,因为我总是使用 Xcode 而不是 make。但至于最后一部分,如果您支持 10.6 之前的 OS 版本,您可能还需要为 PowerPC 编译(arch.code "ppc")。

      【讨论】:

      • PowerPC 是否构建了 Mac 消费市场的重要部分仍然期望的东西?那么通用二进制文件总共需要 3 个平台?
      • 我不知道百分比是多少,但我仍然支持 PowerPC,而且我认为许多其他产品都支持。而且我还不支持 64 位,因为我的产品部分是 Carbon。但是如果你现在正在开发一种新产品,那么只选择英特尔并不是不合理的。考虑您的市场:某些细分市场(例如教育)可能会比其他细分市场更长时间地使用旧硬件。
      • 还有一件事:据我所知,术语“通用二进制”通常是指 i386+ppc,而不是 i386+x86_64。
      • nantucket:大约 10% 到 40% 的 Mac 用户拥有 PPC 计算机。但是,我怀疑用作“主机”的 PPC 数量会低于 10%。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多