2016-07-08 8 views
2

Ich schaute auf here, um zu sehen, wie C++ zu Python verfügbar machen. Ich habe Python-Deep-Learning-Code gebaut, der Boost-Python verwendet, um C++ und Python zu verbinden, und es läuft ok, also hat mein System Dinge für boost-python alread setup. Hier ist mein Hallo.cpp Code (wo ich WorldC und WorldP verwendet, um deutlich zu zeigen, die Verwendung von C++ und Python-Klassennamen in der Deklaration. Ich weiß nicht, warum die ursprüngliche Webseite denselben Klassennamen verwendet World, um Verwirrung zu verursachen Anfänger.)Aussetzen der C++ - Klasse in Python (nur ET_DYN und ET_EXEC können geladen werden)

#include <boost/python.hpp> 
using namespace boost::python; 

struct WorldC 
{ 
    void set(std::string msg) { this->msg = msg; } 
    std::string greet() { return msg; } 
    std::string msg; 
}; 

BOOST_PYTHON_MODULE(hello) 
{ 
    class_<WorldC>("WorldP") 
     .def("greet", &WorldC::greet) 
     .def("set", &WorldC::set) 
    ; 
} 

und das ist, wie ich hello.so

g++ -shared -c -o hello.so -fPIC hello.cpp -lboostpython -lpython2.7 -I/usr/local/include/python2.7 

gemacht Wenn ich Import hallo in python laufen, es mir diesen Fehler gibt.

>>> import hello 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./hello.so: only ET_DYN and ET_EXEC can be loaded 

Kann mir jemand sagen, was los ist?
(ich bin unter meinem Home-Verzeichnis für Python-Umgebung mit anaconda2, aber da Code meines tiefer Lernens mit Boost-Python ok baut, soll es in meinem System-Verzeichnis kein Problem mit boost/python.hpp sein)

Antwort

4

I Ich habe dieses Problem schon lange vergessen und musste dieses Thema heute noch einmal aufgreifen.
Ich habe zwei Probleme gefunden. Das erste Problem war, dass ich die Option -c angegeben habe, die den Compiler nur dazu gebracht hat, die Quelle zu kompilieren und nicht zu verknüpfen. Das zweite Problem war, dass der Name der Bibliothek falsch war (ich suche/usr/lib64 und es gab libboost_python.so, also sollte -lboost_python anstelle von -lboostpython sein). Also der richtige Weg, um ihn zu bauen ist:

g++ -shared -o hello.so -fPIC hello.cpp -lboost_python -lpython2.7 -I/usr/local/include/python2.7 

Ich fand es in Python ok läuft. :)