2017-11-27 2 views
1

Ich habe einige C-Bibliothek, die ich in Python mit CFFI zugreifen möchte. Nach dem Erstellen der Bibliothek, bekomme ich die 2 Dateien: $HOME/libcint/include/cint.h und $HOME/libcint/lib/libcint.so.laden .so Bibliothek mit cffi

Jetzt für die CFFI API-Modus Ich habe versucht:

from cffi import FFI 
libcint_dir = os.path.expanduser('~/libcint') 
ffibuilder = FFI() 
ffibuilder.set_source('_libcint', 
    r'#include <include/cint.h>', 
    include_dirs = [libcint_dir], 
    libraries = ['libcint'], 
    library_dirs = [os.path.join(libcint_dir, 'lib')], 
) 

Aber es scheitert die libcint.so Datei zu finden:

/usr/bin/ld: cannot find -llibcint 

Der Weg in libcint_dir ist richtig, weil ich Sie nicht bekommen Fehlermeldung, dass die Header-Datei nicht gefunden wurde. Auch ich habe es geschafft, die Bibliothek mit dem ctypes Modul erfolgreich zu verbinden, so dass die libcint.so selbst in Ordnung sein sollte.

Was mache ich hier falsch?

Wenn ich das richtig mache, dann sind hier 3 Schritte erforderlich. (Bitte korrigieren Sie mich, wenn ich hier etwas verwirrt.)

  1. libcint Kompilieren libcint.so
  2. wodurch man den Aufbau der Python-Wrapper mit CFFI
  3. das Modul in Schritt 2 in das eigentliche Python-Programm gebaut Import

Mein Problem hier ist über den zweiten Schritt.

Antwort

3

Sie sagen libraries = ['libcint'], was bedeutet, dass der Compiler nach einer Datei namens liblibcint.so sucht. Was Sie schreiben sollten, ist also libraries = ['cint'].

0

Sie werden wahrscheinlich von dem Problem der Kompilierungszeit im Vergleich zur Laufzeit der Bibliotheken gebissen. Der Pfad, den Sie der Bibliothek geben, wird nur zum Zeitpunkt der Kompilierung von GCC verwendet. Zur Laufzeit sucht es nach einer Bibliothek mit dem korrekten Namen, verwendet jedoch nur die vom System konfigurierten Standardpfade. Sie müssen also dem System mitteilen, wo diese Bibliothek zu finden ist. Sie können eine tun:

  • Umzug der Bibliothek zu einem Standard-Ort wie /usr/local/lib;

  • mit der Umgebungsvariablen LD_LIBRARY_PATH=/path/to/library laufen lassen; Wenn Sie den Pfad innerhalb des kompilierten Moduls fest codieren möchten, können Sie extra_link_args=['-Wl,-rpath=' + path] im Aufruf von set_source() verwenden.

Dies ist alles unter der Annahme von Linux. Auf einer anderen Plattform sind wahrscheinlich alle drei Optionen ebenfalls verfügbar, aber die Details unterscheiden sich ...

+0

Aber ich spreche über Kompilation. Der obige Code soll '_libcint.c' und' _libcint.o' erzeugen. Oder habe ich hier etwas verwirrt? – Feodoran

+0

Ah, vielleicht bin ich verwirrt. Es könnte sein, dass Sie "' libraries = ['cint'] '' anstelle von '' libcint'' sagen müssen. –

+0

Ja, das war's! Scheint seltsam, dass die Header-Datei einen anderen Namen hat. Könnten Sie Ihre Antwort vielleicht neu formulieren? – Feodoran

Verwandte Themen