Ich versuche eine Bindung für eine C ++ - Bibliothek eines Anbieters zu schreiben. Ich habe erfolgreich Snippets wie die folgenden verwendet, um Init-Funktionen in den anderen Modulen zu definieren, aber in diesem scheint es nicht zu funktionieren: Es kompiliert gut, aber wirft den Importfehler, sobald ich versuche, es in einen Test zu importieren Skript. Was könnte hier falsch sein?
%Vor%Dies ist auf 32-Bit-Linux mit gcc 4.4.4.
Ich hatte das gleiche Problem. Zur Kompilierzeit:
Ich habe gerade vergessen, die C-Datei zu kompilieren, die mein Modul definiert ... Seufz ...
Also ja, das erste, was Sie überprüfen sollten: Ihr Makefile oder Ihr Kompilierbefehl! :)
Ich hatte die gleiche Fehlermeldung, aber ich habe meine .c-Datei umbenannt und vergessen, den Namen im Code zu aktualisieren. Die Funktion "initxxx" und ein Argument darin.
Stellen Sie sicher, dass Sie keine Python-Versionen mischen. In Python Version 2 wurde die Init-Funktion Init_ aufgerufen, während in Version 3 diese Funktion PyInit _
genannt wirdIn meinem Fall passierte dies, als SWIG 3.0.2 Python 3.4 zum Generieren von Bindungen verwendete, während meine Python-IDE den Python 2.7-Interpreter aufgerufen hat.
Sie können den Unterschied in der generierten .cxx-Datei sehen:
%Vor%Unter Linux können Sie auch den folgenden Befehl verwenden, um Ihre .so-Exporte zu überprüfen:
%Vor%Dies gibt Ihnen den Namen der Init-Funktion in Ihrer Bibliothek.
Stellen Sie sicher, dass Sie Ihre _wrap.cxx einbeziehen. Es scheint mir, dass es nicht in dein Modul kompiliert wird.
Unter Linux kann es in diesem Fall helfen, strace auszuführen. Überprüfen Sie, ob der Name des Bibliothekspythons, nach dem gesucht wird, mit dem Namen der von Ihnen erstellten Bibliothek übereinstimmt.
Die swig Dokumentation erwähnt hier :
Dieser Fehler wird fast immer verursacht, wenn der freigegebenen Objektdatei ein falscher Name zugewiesen wird. Wenn Sie beispielsweise eine Datei example.so anstelle von _example.so erstellt haben, erhalten Sie diesen Fehler.