Python importieren & mit cdll (mit einem linux .so Datei)

Nach einer meiner letzten Fragen über Python & C ++ Integration wurde mir gesagt, Dlls bei Windows zu verwenden. (Vorherige Frage)

Das hat ok gemacht:

cl /LD A.cpp B.cpp C.pp

In Windows-Umgebung, nach der Einstellung der Include-Pfad für Boost, cryptopp Quellen und cryptopp Bibliotheken.

Jetzt versuche ich, das gleiche in Linux zu tun, das Erstellen einer .so-Datei zum Importieren durch Ctypes auf python2.5. Ich tat:

gcc -Wall -Wextra -pedantic A.cpp B.cpp C.cpp /usr/lib/libcryptopp.so -shared -o /test/decoding.so

Und das so objekt wird ok geschaffen Wenn entfernt "-shared" Kompilation ist OK, aber stoppt als kein Haupt drin (offensichtlich;)). Natürlich existiert auch libcryptopp.so.

Aber wenn ich in python gehen und die "so" Datei importiere, sagte es, dass das Attribut kein Objekt "entschlüsseln", "verschlüsseln" oder was auch immer ich dort hinlege. Mit "dir" über die dll-Objekte bestätigt, dass sie nicht da sind.

Externe Funktionen sind in A.cpp als:

 int encrypt (params...) //.. return num; int decrypt (params...) //.. return num; 

Auch versucht mit:

 extern "C" encrypt (params...) ..... 

Kann mir jemand sagen was ich falsch mache?

Danke im Voraus!

Lappen

2 Solutions collect form web for “Python importieren & mit cdll (mit einem linux .so Datei)”

C ++ – Compiler mangelt Namen von Funktionen. Um zu tun, was du versuchst zu tun, musst du den Deklarationsprototyp haben

 extern "C" {...} 

Es ist schwer zu sagen von Ihren Proben, was genau Sie in einer Quelldatei haben. Wie bereits erwähnt, benutze das netz-Dienstprogramm, um zu sehen, welche Objekte in deinem gemeinsamen Objekt sind.

Kompilieren Sie Ihr Objekt nicht ohne -shared. Python-Ladebibliothek unterstützt keine statisch verknüpften Objekte, soweit es sich bewusst ist.

Kompiliere dein Objekt mit g ++ – Compiler stattdessen wird es mit der Standard-C ++ – Bibliothek verknüpfen, gcc nicht.

Nur um etwas zu verdoppeln, da du Boost hast.

 #include <string> #include <boost/python.hpp> using namespace std; string hello(string s){ return "Hello World!"; } BOOST_PYTHON_MODULE(pyhello){ using namespace boost::python; def("hello", hello); } 

In python

 >>> import pyhello >>> print pyhello.hello() Hello World! 

Nur meine 2 Cent, sorry, wenn dies nicht helfen könnte.

  • Wie man "Performance-basierte" (Benchmark) Unit-Tests in Python zu tun
  • Die primäre Wahrscheinlichkeit der wahren wahren Primzahlen
  • Programmgesteuertes Gespräch mit einem seriellen Port in OS X oder Linux
  • Splitlines in Python eine Tabelle mit leeren Räumen
  • Warum funktioniert das einfache Echo im Unterprozeß nicht
  • Python Gtk + Entwicklung in Linux mit Eclipse + PyDev, Ungelösten Import: Gtk
  • Verwenden Sie Standard-Python anstelle von Anaconda-Installation, wenn Sie vom Terminal aufgerufen werden
  • Ändern Sie das Arbeitsverzeichnis in der Shell mit einem Python-Skript
  • Python: warum print-Anweisungen und subprocess.call () -Ausgabe nicht synchron sind?
  • Probleme bei der Installation von scipy in virtualenv auf einem amazon ec2 linux micro Instanz
  • Mysql_config nicht gefunden bei der Installation von mysqldb python interface
  • Python ist die beste Programmiersprache der Welt.