0

参考这个关于编译的问题。我不明白我的 Mac 程序如何使用正确的 -arch,使用那些 -arch 标志进行编译, -arch 标志适用于我所在的系统(ppc64 g5),但仍然产生错误的目标代码。

另外,如果我使用交叉编译器并且在 Linux 上为 mac 生成 10.5 代码,这与我上面描述的有什么不同?

背景是我试图编译各种apache模块。它们使用 -arch ppc、ppc64 等进行编译。我没有收到任何错误,我得到了我的 mod_whatever.so。但是,apache 总是会抱怨找不到某些符号。显然,它与编译器生成的内容有关,即使文件类型表明它适用于 ppc、ppc64、i386、x_64(通用二进制)并且似乎与我拥有的所有其他 .so 模块匹配。

我想我不明白它如何能够毫无问题地为我的系统编译,然后说我的系统无法使用它。也许我不明白编译器实际上给了我什么。

编辑:所有错误消息和完整的过程都可以在这里看到。

谢谢你。

4

1 回答 1

1

在没有安装 G5 或 OSX 服务器的情况下查看其他线程和其他地方,我只能提出一些意见和建议,但也许它们会有所帮助。

  1. 修改操作系统供应商安装的软件通常不是一个好主意。安装一个新的 Apache 模块比覆盖现有库的问题要少,但是您仍然受供应商的摆布,因为软件更新可能会删除您的修改,除此之外,您还必须弄清楚供应商的版本是怎样的建在首位。OS X 世界的一个常见做法是通过使用例如MacPorts完全独立地安装开源产品(如 Apache)来避免这种情况。这也有它的缺点:为了实现高度的独立性,MacPorts 经常会为已经在 OS X 中的东西下载和构建大量依赖包,但除了一些额外的构建周期和磁盘空间之外没有什么害处.

  2. 也就是说,应该可以构建和安装 apache 模块来补充 Apple 提供的模块。Apple 确实在这里发布了它对开源产品所做的更改;您可以在那里深入了解各种版本以找到包含源代码、Makefile 和应用补丁的 apache 目录。这可能会有所帮助。

  3. 确保您构建的 mod_*.so 是真正的 64 位,并且不依赖于任何非 64 位库。用于otool -L mod_*.so查看每个引用的动态库,然后file在这些库上使用以确保它们都具有 ppc64 变体。

  4. 确保您使用的是最新的开发人员工具(Xcode 3.1.3 是最新的)。

  5. 虽然开发者工具链使用了很多开源组件,但苹果增强了很多,在 OS X 的 ABI、通用二进制支持、动态库等方面存在很大差异。底线是 OS X 目标对象的交叉编译Linux(或任何其他非 OS X 平台)上的代码既不受支持也不实用。

于 2009-08-12T02:21:12.323 回答