Python ctypes.cdll.LoadLibrary在2.6.5和2.7.1中表现不同

2 投票
1 回答
4253 浏览
提问于 2025-04-16 08:19

我有一个系统上装了两个版本的Python,分别是2.6.5和2.7.1。我发现其中一个版本的LoadLibrary可以正常工作,而另一个却不行。

Python 2.7.1 (r271:86832, Nov 30 2010, 10:03:07)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary("./mylib.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/local/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./mylib.so: undefined symbol: compress2

在正常工作的2.6.5版本中:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary("./mylib.so")
<CDLL './mylib.so', handle 98bbd88 at b785c94c>

有没有人知道怎么找出为什么Python 2.7.1不工作的原因?

1 个回答

1

出于某种原因,Python 的 ctypes 对库的依赖关系特别挑剔。我还没搞明白为什么 2.6.5 版本能正常工作,但我发现下面这个方法可以解决问题:

在编译 mylib.so 时,我需要明确指定或链接到 zlib 库。因为 "compress2" 是来自 zlib 库的,所以我可以这样做:

g++ blah blah mylib.so blah blah -lz

这里的 -lz 是用来链接 zlib 库的,执行 "ldd mylib.so" 后就能看到这个库了。这样做就能解决问题,让 "LoadLibrary" 不再失败。

撰写回答