我有一个仅存在 32 位版本的应用程序。为了使用它,我习惯在启动 Mac 之前同时按下2
& 3
,这样它就会以 32 位模式运行。但是,某些应用程序(之前安装的 64 位版本)在此模式下始终会崩溃。
我偶然看到了一个在64位系统上运行32位应用程序的解决方案:
arch -i386 theApp.app
但我尝试时出现arch: /Applications/theApp.app isn't executable
错误。我检查了文件权限,显示drwxrwxr-x
它应该是可执行的,嗯?
编辑:正如@gd1所说,theApp.app 是一个文件夹(我认为在 OSX 中它被称为 bundle ),因此它不可执行。
但我仍然需要一个解决方法:
如何在我的 64 位系统中正确运行我的 32 位应用程序?
编辑:我arch
现在可以使用以下命令打开该应用程序(感谢@GordonDavisson):
arch -i386 /Applications/theApp.app/Contents/MacOS/theApp
但是应用程序运行时出现Components lost
错误,日志显示如下:
Kjuly@MacBook-Pro:/Applications$ arch -i386 闪讯.app/Contents/MacOS/闪讯
2012-01-08 16:17:53.381 闪讯[472:1107] isActive: ioctl to kernel socket error 2 ,No such file or directory
2012-01-08 16:17:53.436 闪讯[472:1107] The AppPath = /Applications/闪讯.app
2012-01-08 16:17:53.437 闪讯[472:1107] The src path = /Applications/Èó™ËÆØ.app/xlpppoe.kext
2012-01-08 16:17:58.892 闪讯[472:1107] Set Driver Ok...
/tmp/xlpppoe.kext failed to load - (libkern/kext) requested architecture/executable not found; check the system/kernel logs for errors or try kextutil(8).
顺便说一句,闪讯.app
(我讨厌它!!但我需要它..)用于连接我在中国的大学的网络。
编辑:
Kjuly@MacBook-Pro:~$ file /Applications/闪讯.app/Contents/MacOS/闪讯
/Applications/闪讯.app/Contents/MacOS/闪讯: Mach-O executable i386
和
Kjuly@MacBook-Pro:~$ file /Applications/闪讯.app/xlpppoe.kext/Contents/MacOS/xlpppoe
/Applications/闪讯.app/xlpppoe.kext/Contents/MacOS/xlpppoe: Mach-O object i386
看来它只有 32 位版本,并且依赖于 32 位内核。哦,我太伤心了。:(
这是我在@GordonDavisson 的帮助下获得的一些信息,也许其他人需要它。
这文档展示了一些临时使用 32 位内核启动的方法,以便将较旧的内核扩展用于第三方软件或硬件。
这是关于“与 64 位内核的兼容性”:
依赖于与 Mac OS X Server v10.5 兼容的内核扩展的第三方软件(如虚拟化引擎)或硬件(如 PCIe 卡)可能无法在使用 Mac OS X v10.6 中的 64 位内核的 Mac 上运行。请联系软件或硬件供应商,获取可与 Mac OS X Server v10.6 中的 64 位内核兼容的更新内核扩展。
作为一种解决方法,您可以暂时启动 32 位内核,以便将较旧的内核扩展用于第三方软件或硬件。
答案1
OS X 没有整体的 64/32 位模式;它会以启动时看起来“最佳”的模式运行各个程序。在计算机启动时按住3和2将使其内核以 32 位模式运行,但这与程序以何种模式运行无关。OS X 可以在 64 位内核下顺利以 32 位模式运行程序,也可以在 32 位内核下以 64 位模式运行程序。
如果您的程序仅包含 32 位代码,它将以 32 位模式运行,而无需您执行任何特殊操作。您可以通过file
在可执行文件上运行命令来检查这一点(通常在 AppName.app/Contents/MacOS/AppName 中)。以下是几个示例:
$ file /Applications/Chess.app/Contents/MacOS/Chess
/Applications/Chess.app/Contents/MacOS/Chess: Mach-O universal binary with 2 architectures
/Applications/Chess.app/Contents/MacOS/Chess (for architecture x86_64): Mach-O 64-bit executable x86_64
/Applications/Chess.app/Contents/MacOS/Chess (for architecture i386): Mach-O executable i386
$ file /Applications/VLC.app/Contents/MacOS/VLC
/Applications/VLC.app/Contents/MacOS/VLC: Mach-O universal binary with 2 architectures
/Applications/VLC.app/Contents/MacOS/VLC (for architecture i386): Mach-O executable i386
/Applications/VLC.app/Contents/MacOS/VLC (for architecture ppc): Mach-O executable ppc
$ file /Applications/Adobe\ Reader\ 9/Adobe\ Reader.app/Contents/MacOS/AdobeReader
/Applications/Adobe Reader 9/Adobe Reader.app/Contents/MacOS/AdobeReader: Mach-O executable i386
...这告诉我Chess.app包含32位和64位英特尔代码(分别为“i386”和“x86_64”),VLC.app包含32位英特尔和32位PowerPC(“ppc”)代码,而Adobe Reader仅包含32位英特尔代码。
您还可以从系统信息的系统报告(在软件->应用程序部分)中获取部分信息(尽管不那么详细)。
如果某个应用程序同时具有 32 位和 64 位代码,您可以在 Finder 的应用程序“获取信息”窗口中选择使用哪一个(将有一个“以 32 位模式打开”复选框),或者使用arch
可执行文件上的命令(例如arch -i386 /Applications/theApp.app/Contents/MacOS/theApp
)。但您通常不需要这样做,操作系统会很好地选择最佳模式。
(您需要手动覆盖模式选择的一个实例是插件或库兼容性。如果您有一个 32 位和 64 位应用程序,但它需要能够加载仅 32 位的插件或库,您必须强制程序在 32 位模式下运行。)
如果您的 64 位程序无法在 32 位内核下正确运行,那么它们要么存在某种奇怪的错误,要么发生了更奇怪的事情。如果您提供具体细节,我们也许能够找出到底出了什么问题。
编辑:看起来该应用程序只有 32 位,并且安装了仅 32 位的内核扩展 (kext)。虽然 32 位应用程序部分可以在任何内核模式下运行,但 32 位 kext 只能加载到 32 位内核中(它就像内核的插件)。您可以在启动时按住3和以 32 位模式运行内核2,也可以使用命令永久运行内核sudo systemsetup -setkernelbootarchitecture i386
(请参阅 Apple 的知识库 #HT3773)。
请注意,无需执行任何特殊操作即可在 32 位模式下打开应用程序;因为这是唯一包含的格式,所以无论如何启动它,它都会在该模式下运行(特别是,命令arch
是不是必要的)。
如果您的任何 64 位应用程序无法在 32 位内核下正常运行,那就是一个单独的问题,我建议您发布另一个有关该问题的问题。