如何检查库是不是是在 Mac OS X 上构建的 32 位/64 位?

Posted

技术标签:

【中文标题】如何检查库是不是是在 Mac OS X 上构建的 32 位/64 位?【英文标题】:How to check if a library is 32bit/64bit built on Mac OS X?如何检查库是否是在 Mac OS X 上构建的 32 位/64 位? 【发布时间】:2011-03-13 12:56:51 【问题描述】:

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

文件“qtdemo.py”,第 46 行,在 进口小口 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 位?

【问题讨论】:

Determine if an executable (or library) is 32 -or 64-bits (on OSX)的可能重复 【参考方案1】:

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

【讨论】:

虽然这适用于可执行文件,但不适用于库。道格在下面的回答是正确的。 (***.com/a/28856293/930949)【参考方案2】:

要在您正在使用的 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.maxsize替换sys.maxint

$ python3 -c "import sys;print('%x'%sys.maxsize)"
7fffffff

【讨论】:

【参考方案3】:
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 file 不适用于所有库类型。它会猜测格式,所以你会看到:'libn.a: current ar archive random library' 是一个静态库,你会从lipo 看到这个:'Non-fat file: libn.a is architecture: x86_64'。对于某些文件类型,它可以工作,但是为什么要使用一个使用一些“魔术测试”(参见 man 文件)猜测文件类型的工具,而不是为此目的明确存在的 lipo 工具?跨度>

以上是关于如何检查库是不是是在 Mac OS X 上构建的 32 位/64 位?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 在 OS X/Mac 上构建 C++ 库

如何在 Mac OS X Lion 上安装 Python 库“gevent”

如何构建本机 Mac OS X 安装程序(在非 Mac 平台上)?

Homebrew OS X OpenCV - 在另一台 Mac 上运行时寻找 dylib

如何分发带有依赖库的 Mac OS X?

如何在 Mac OS X 上构建 DTrace?