【问题标题】:Cocoa 32 bit and 64 bit binaries within app应用程序中的 Cocoa 32 位和 64 位二进制文​​件
【发布时间】:2011-04-19 16:16:19
【问题描述】:

我最新的 Mac 应用被 Mac App Store 拒绝。

由于应用程序中包含自包含的 unix 可执行文件,基本上它不起作用。 我之前在我的应用程序中包含了一个二进制文件,该应用程序在 Mac App Store 中,但这个 unix 二进制文件给我带来了麻烦。

我在 i386 机器上编译了这个二进制文件的 2 个不同版本,另一个在 x86_64 机器上编译。 使用“文件 appname”,我得到了 64 位二进制文​​件

Mach-O 64 位可执行 x86_64

和 32 位二进制

Mach-O 可执行 i386

在运行时我尝试执行正确的二进制文件,但我注意到这似乎无关紧要?我使用哪个二进制文件,我可以在 i386 机器上执行 x86_64 并且一切正常。

我的应用程序构建设置是默认项目附带的(标准 32/64 位英特尔)。

问题是当我的应用程序在 i386 机器上运行时,我应该尝试运行 32 位二进制文​​件吗?
当我在 i386 机器上运行时,为什么我的 x86_64 二进制文件可以工作?

谢谢,约翰。

【问题讨论】:

  • 你怎么知道‘i386机器’只有i386?另外,为什么不是通用版本?
  • 我使用“uname -a”检查了 i386 机器,上面写着 i386,但我不知道它可以运行其他架构?
  • IIRC uname 告诉内核架构,支持 64 位的机器可以引导 32 位内核——这在一些支持 64 位但 EFI 不支持的 Core 2 Duo 机器中是强制性的.运行sysctl hw.cpu64bit_capable — 如果机器支持 64 位,则显示 1,否则显示 0。
  • uname -a 会告诉你内核是 32 位还是 64 位,但它不会告诉你 CPU 的情况。前几代英特尔 Mac 使用支持 64 位的 Core 2 处理器,附带 32 位固件,因此内核必须是 32 位,但用户空间代码可以是 64 位。
  • 啊,我看到两台机器都说它们支持 64 位。我认为它的核心独奏真的很老了,可能会让我感到悲伤。

标签: objective-c cocoa macos unix


【解决方案1】:

为什么不将 Unix 工具构建为通用二进制文件?然后操作系统会根据机器的架构选择正确的二进制版本来运行。

编辑 - 添加我的评论作为正确答案的一部分。

您需要构建 i386 和 x86_64 二进制文件。显然,您需要为这两种架构构建 exe 和所有依赖项。对于 i386 架构,到处使用 gcc 标志 -arch=i386 可能就足够了。然后你可以使用lipo 来组合这两个二进制文件。

【讨论】:

  • 我想简单的答案是我不是 100% 确定如何去做。该工具是 httrack,我很难让依赖关系正确。我使用了这个命令 [./configure --prefix=/opt/local --with-zlib=/opt/local --enable-shared=no] 我需要的重要一点是二进制文件不依赖于其他库,所以它将完全独立运行。如何使用 i386 和 x86_64 进行编译?
  • 您需要构建 i386 和 x86_64 二进制文件。显然,您需要为这两种架构构建 exe 和所有依赖项。对于 i386 架构,到处使用 gcc 标志 -arch=i386 可能就足够了。然后你可以使用 lipo 来组合这两个二进制文件。
  • 我现在才这样做,弄明白了 lipo。 “lipo httrack64 httrack32 -create -output httrackx”我认为这将起作用,因此执行的二进制文件将起作用,而无需我试图找出在我的可可应用程序中执行哪个二进制文件。谢谢。
  • 谢谢你的帮助,我已经和Lipo结合了。我现在要重新提交到应用商店并弄清楚发生了什么。干杯,约翰。
  • @John:祝你好运。我只是希望这是拒绝问题,而不是您在 GPL 下包含二进制文件。
【解决方案2】:

你把事情弄得太复杂了。你不需要64位的机器来构建64位的二进制文件,在64位的机器上构建32位的二进制文件也不是问题。

GCC 和 XCode 轻松支持构建 32 位通用或 32/64 位通用映像,因此您完全不必担心运行正确的映像。

【讨论】:

  • XCode 正在为我创建通用应用程序,运行良好。我在我的应用程序中包含了一个 unix 二进制文件,我已经设法从命令行编译了它。我有这个应用程序的 x86_64 和 i386 版本,但由于某种原因,我在让这个二进制文件在不同的架构上正常工作时遇到了问题。现在已经用lipo来组合了,谢谢大家的帮助。
猜你喜欢
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2012-01-19
  • 2017-09-24
  • 2014-08-19
  • 1970-01-01
  • 2012-01-19
相关资源
最近更新 更多