2016-08-31 3 views
0

Ich möchte einige Funktionen aus einer gemeinsam genutzten Bibliothek in Python verwenden. Aus dem Python-Doc weiß ich, Ctypes ist eine gute Wahl. Eine solche Bibliothek hat jedoch einige undefinierte Symbole und ich sollte sie mit einer anderen gemeinsam genutzten Bibliothek verbinden, um die Symbole zu erhalten.Python Ctypes Link mehrere gemeinsame Bibliothek mit Beispiel gsl gslcblas

In g ++ ist es einfach: g ++ main.cpp -la -lb. Die Funktion, die ich brauche, ist in liba.so, und liba.so hat eine undefinierte Funktion, die in libb.so gelöst werden kann.

Aber wie geht das in Ctypes? ctypes.cdll.LoadLibrary ('liba.so') sagte, dass es einige undefinierte Symbole gibt, wie kann man ctypes mitteilen, libb.so zu finden? Weil ldd liba.so keine Verbindung zu libb.so zeigt.

Beispiel: Ich möchte einige Funktionen in gsl verwenden. In g ++:

g++ main.cpp -lgsl -lgslcblas 

und LDD libgsl.so zeigt keinen Link zu libgslcblas

in Python:

ctypes.cdll.LoadLibrary('libgsl.so') 

wie ctypes sagen libgslcblas zu finden?

Das gleiche Problem passiert auch, wenn ich scalapack benutze. Ich benutze Ubuntu 16.04

Antwort

1

Diese old answer erzählt mode=ctypes.RTLD_GLOBAL, das heißt in diesem Fall anzuwenden

import ctypes 

dll1 = ctypes.CDLL('libgslcblas.so', mode=ctypes.RTLD_GLOBAL) 
dll2 = ctypes.CDLL('libgsl.so')