Python ctypes在Mac OS X上无法加载动态库

7 投票
2 回答
7541 浏览
提问于 2025-04-16 02:46

我有一个C++的库叫做 repeater.so,我可以在Linux系统中用Python这样加载它:

import numpy as np                                    
repeater = np.ctypeslib.load_library('librepeater.so', '.')

但是,当我在Mac OS X(雪豹版,32位)上编译同样的库,得到 repeater.dylib,然后在Python中运行以下代码:

import numpy as np                                
repeater = np.ctypeslib.load_library('librepeater.dylib', '.')

我遇到了以下错误:

OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found.  Did find:
    /mydir/librepeater.dylib: mach-o, but wrong architecture

在Mac OS X上加载动态库时,我需要做些什么不同的操作吗?

2 个回答

11

这不仅仅是关于dylib里有哪些架构的问题,还涉及到你正在使用的Python解释器的架构。如果你在OS X 10.6上使用的是苹果提供的Python 2.6.1,默认情况下它会尽量以64位模式运行。但是你提到你的库是以32位编译的,所以你需要强制Python以32位模式运行。对于苹果提供的Python,有一种方法可以做到这一点,就是设置一个特殊的环境变量:

$ python -c "import sys; print sys.maxint"
9223372036854775807
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
$ python -c "import sys; print sys.maxint"
2147483647

想了解更多信息,可以查看苹果的man 1 python文档。

4

不行。正如错误信息所说,你的 Python 和 librepeater.dylib 文件之间存在架构不匹配的问题。你可以使用 file 命令来检查 librepeater.dylib 的架构是什么;而你的 Python 是用一个没有列出的架构来构建的。

撰写回答