在Objective C(Mac OS X)中检测CPU架构(32位/ 64位)运行时

Ger*_*nis 3 macos objective-c cpu-architecture 32bit-64bit

我正在拧一个Cocoa应用程序,它需要执行一些针对32位和64位优化的(控制台)应用程序.因此,我想检测运行应用程序的CPU架构,以便启动正确的控制台应用程序.

简而言之:如何检测应用程序是否在64位操作系统上运行?

编辑:我知道Mach-O胖二进制文件,这不是我的问题.我需要知道这一点,所以我可以启动另一个非捆绑(控制台)应用程序.一个针对x86进行了优化,另一个针对x64进行了优化.

Chi*_*chi 10

有一种超级简单的方法.编译可执行文件的两个版本,一个用于32位,一个用于64位,并将它们与lipo结合使用.这样,正确的版本将始终执行.

gcc -lobjc somefile.m -o somefile -m32 -march=i686
gcc -lobjc somefile.m -o somefile2 -m64 -march=x86_64
lipo -create -arch i686 somefile -arch x86_64 somefile2 -output somefileUniversal
Run Code Online (Sandbox Code Playgroud)

编辑:或者首先编译通用二进制文件 gcc -arch i686 -arch x86_64

回应OP的评论:

if(sizeof(int*) == 4)
    //system is 32-bit
else if(sizeof(int*) == 8)
    //system is 64-bit
Run Code Online (Sandbox Code Playgroud)

编辑:D'哦!我没有意识到你需要运行时检查...通过输出sysctl -A,两个变量看起来可能有用.尝试解析的输出sysctl hw.optional.x86_64sysctl hw.cpu64bit_capable.我没有32位Mac来测试这个,但是在Core2Duo Mac上的Snow Leopard中这两个都设置为1.


Mir*_*sin 7

用于[[NSRunningApplication currentApplication] executableArchitecture]返回以下常量之一:

  • NSBundleExecutableArchitectureI386
  • NSBundleExecutableArchitectureX86_64
  • NSBundleExecutableArchitecturePPC
  • NSBundleExecutableArchitecturePPC64

例如:

switch ([[NSRunningApplication currentApplication] executableArchitecture]) {
  case NSBundleExecutableArchitectureI386:
    // TODO: i386
    break;

  case NSBundleExecutableArchitectureX86_64:
    // TODO: x86_64
    break;

  case NSBundleExecutableArchitecturePPC:
    // TODO: ppc
    break;

  case NSBundleExecutableArchitecturePPC64:
    // TODO: ppc64
    break;

  default:
    // TODO: unknown arch
    break;
}
Run Code Online (Sandbox Code Playgroud)