Ich bin auf OS X und installiert das Gtk + 3-Paket mit Homebrew.Ist die Reihenfolge, in der dynamische Bibliotheken geladen werden, von Bedeutung?
brew install gtk+3
Ich kann mit dem ctypes
Modul die installierten Bibliotheken in Python laden.
$ python2.6
Python 2.6.9 (unknown, Oct 23 2015, 19:19:20)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary('/usr/local/lib/libatk-1.0.0.dylib')
<CDLL '/usr/local/lib/libatk-1.0.0.dylib', handle 7fbd10f1a250 at 10aa>
>>> cdll.LoadLibrary('/usr/local/lib/libglib-2.0.0.dylib')
<CDLL '/usr/local/lib/libglib-2.0.0.dylib', handle 7fbd10f0ffb0 at 10aa22dd0>
>>> ^D
So weit so gut. Eine Sache, die mich stört ist, dass, wenn ich versuche, die gleichen zwei Bibliotheken oben, aber in einer anderen Reihenfolge zu laden, wirft es eine Symbol nicht gefunden Ausnahme.
$ python2.6
Python 2.6.9 (unknown, Oct 23 2015, 19:19:20)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary('/usr/local/lib/libglib-2.0.0.dylib')
<CDLL '/usr/local/lib/libglib-2.0.0.dylib', handle 7fad13d00d60 at 10a688210>
>>> cdll.LoadLibrary('/usr/local/lib/libatk-1.0.0.dylib')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py", line 423, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ctypes/__init__.py", line 345, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(/usr/local/lib/libatk-1.0.0.dylib, 6): Symbol not found: _g_free
Referenced from: /usr/local/lib/libatk-1.0.0.dylib
Expected in: flat namespace
in /usr/local/lib/libatk-1.0.0.dylib
>>> ^D
So Laden atk
zuerst, und dann glib
arbeitet. Andersherum nicht. Kann jemand dieses Verhalten erklären?
Ja, C-Bibliotheken sind Reihenfolge-abhängig, mit den Abhängigkeiten später in der Reihenfolge als die Abhängigen. In C mit (sagen wir) libs A B und C, wenn ein in A verwendetes Symbol, das in C gefunden werden sollte, zuerst von einem gleichnamigen Interloper in B maskiert wird. Und bestellt sie als B C A bricht. Hier haben Sie den letzteren Fall, wo libatk A ist, das Symbol _g_free ist und glib * definitiv * später mit der Definition von _g_free geladen werden muss. Der Linker verfolgt, dass die Verwendung von _g_free von A von einer späteren Bibliothek erfüllt werden muss. –