2010-12-10 3 views
2

Ich habe ein System mit Python Version 2.6.5 und 2.7.1 und ich merke, dass eine LoadLibrary funktioniert, die andere nicht .Python ctypes.cdll.LoadLibrary funktioniert anders zwischen 2.6.5 und 2.7.1

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 

und 2.6.5 Land in Arbeit:

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> 

Kennt jemand ein guter Weg, um herauszufinden, warum Python 2.7.1 funktioniert nicht?

+0

Ich habe festgestellt, dass ich das hier erstellte Beispiel [link] (http://wolfprojects.altervista.org/articles/dll-in-c-for-python/) laden kann, wenn ich ctypes.windll.LoadLibrary verwende aber nicht ctypes.cdll.LoadLibrary. Ähnlich wie bei Ihrem Problem. Python 2.7.1 unter Windows 7. – DangerMouse

Antwort

1

Aus irgendeinem Grund, Python Ctypes wird super anal über Bibliotheksabhängigkeiten. Ich habe immer noch nicht herausgefunden, warum 2.6.5 oben arbeitete, aber das folgende behebt es:

Beim Kompilieren von mylib.so, musste ich angeben oder mit der zlib-Bibliothek explicity verknüpfen. Da „compress2“ aus der zlib-Bibliothek ist, kann ich es durch das folgende tun:

g ++ bla bla bla bla mylib.so lz

Die lz Links auf die zlib-Bibliothek, und es wird dann zeigen, Wenn Sie eine "ldd mylib.so" tun Dies behebt es und ermöglicht "LoadLibrary" nicht fehlschlagen.

+1

Also vielleicht Python 2.6 geladen wurde zlib bereits aus irgendeinem Grund und Python 2.7 ist nicht. Dies ist jedoch eindeutig ein Fehler von mylib, seine Abhängigkeiten zu deklarieren - die Tatsache, dass es vorher funktioniert hat, ist rein zufällig. – ephemient

Verwandte Themen