如何在Mac OS X上检查库文件是32位还是64位构建的?

15

我在使用PyQt/SIP时遇到了一些问题。我猜测SIP是编译成64位的,但Python找不到它。

  File "qtdemo.py", line 46, in 
    import sip
ImportError: dlopen(/Library/Python/2.6/site-packages/sip.so, 2): 找不到合适的映像。找到了:
        /Library/Python/2.6/site-packages/sip.so: mach-o, 但架构错误
  • 如何知道一个库(so/dylib)是32位还是64位?
  • 如何知道我的Python是32位还是64位?

3个回答

17
< p > file 工具可用于识别可执行文件。

示例:

> file /Applications/TextEdit.app/Contents/MacOS/TextEdit 
/Applications/TextEdit.app/Contents/MacOS/TextEdit: Mach-O universal binary with 2 architectures
/Applications/TextEdit.app/Contents/MacOS/TextEdit (for architecture x86_64):   Mach-O 64-bit executable x86_64
/Applications/TextEdit.app/Contents/MacOS/TextEdit (for architecture i386): Mach-O executable i386

1
虽然这对可执行文件有效,但对库不起作用。下面是Doug的正确答案。(https://dev59.com/3nA75IYBdhLWcg3wm6Qj#28856293) - rmcclellan

8
lipo -info target/libexample-df07142d9bfd950a.a
input file target/libexample-df07142d9bfd950a.a is not a fat file
Non-fat file: target/libexample-df07142d9bfd950a.a is architecture: x86_64

或者

lipo -info `which python`
Non-fat file: /usr/local/bin/python is architecture: x86_64

不要使用file


不要使用 file。为什么? - chakrit
2
@chakrit file 在所有库类型上都无法正常工作。它猜测格式,因此您会看到这个:对于静态库,'libn.a: current ar archive random library',而从 lipo 中您会看到这个:'Non-fat file: libn.a is architecture: x86_64'。对于某些文件类型,它可以正常工作,但为什么要使用一个使用一些“魔术测试”来猜测文件类型的工具(请参见 man file),而不是专门用于此目的的工具 lipo 呢? - Doug

7

要在您正在使用的Python实例中查找可用的架构:

$ file "$( "$(which python)" -c "import sys;print(sys.executable)" )"
/usr/bin/python: Mach-O universal binary with 3 architectures
/usr/bin/python (for architecture x86_64):  Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386):    Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc

查找Python当前是否运行在32位或64位系统上(10.6示例):

$ /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)"
7fffffffffffffff
$ arch -x86_64 /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)"
7fffffffffffffff
$ arch -i386 /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)"
7fffffff
$ arch -ppc /usr/bin/python2.6 -c "import sys;print('%x'%sys.maxint)"
7fffffff

对于Python3,将sys.maxint替换为sys.maxsize
$ python3 -c "import sys;print('%x'%sys.maxsize)"
7fffffff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接