2016-07-27 21 views
0

Ich versuche, die Exposing Classes tutorial für Boost.Python bei Boost.org zu folgen. Ich habe bereits die first tutorial erfolgreich gemacht und beim Auskommentieren des Codes tritt der Fehler auf, sobald die Klasse erscheint. Der Teil, in dem alles auseinander fällt, wird gerade in der .so-Datei aus der .cpp-Datei erstellt. Ich bekomme das scheinbar Gemeinsame: "Undefinierte Symbole für Architektur x86_64:". Ich habe mehrere Fragen zu diesem Thema geprüft und alle hatten im Wesentlichen nichts mit meinem Fall zu tun. Ich bin auf OSX 10.11.6 und ich habe Macports verwendet, um Boost und Gcc6 zu installieren. Ich habe alles eingerichtet, also verwende ich gcc und g ++ anstelle von clang. Deshalb glaube ich nicht, dass mein Problem related to this one ist, weil ich tatsächliches g ++ verwende, ich sollte nicht mit diesem libstC++ und libC++ Problem beschäftigen, wenn ich in meinem Verständnis richtig bin. Alle meine Pakete von Macports und Macports selbst sind auf dem neuesten Stand. Will jemand etwas Einblick teilen?Making .so von .cpp: Undefinierte Symbole für die Architektur x86_64: Boost.Python MacPorts GCC6 nicht Clang

Wenn ich den Befehl, die .so zu erstellen: (Ich glaube, ich muss etwas Link zu einer lib in-Boost fehlt, aber ich habe keine Ahnung, was es ist)

g++ -shared -o hello.so -fPIC hello.cpp `python-config --cflags --libs` -lboost_python 

bekomme ich ein wenig Warnung und eine kurze Fehlermeldung, aber die hello.so.dSYM Datei wird im Verzeichnis erstellt und gespeichert:

cc1plus: warning: command line option '-Wstrict-prototypes' is valid for C/ObjC but not for C++

Undefined symbols for architecture x86_64: "boost::python::objects::function_object(boost::python::objects::py_function const&, std::pair const&)", referenced from:

init_module_hello()  in cchDzx8t.o 

"boost::python::objects::register_dynamic_id_aux(boost::python::type_info, std::pair ()(void))", referenced from:

init_module_hello()  in cchDzx8t.o 

ld: symbol(s) not found for architecture x86_64

collect2: error: ld returned 1 exit status

Mein ist CPP-Code genau die gleiche wie in diesem Tutorial gezeigt:

#include <boost/python.hpp> 
using namespace boost::python; 
struct World { 
    void set(std::string msg) { this->msg = msg; } 
     std::string greet() { return msg; } 
     std::string msg; 
}; 
BOOST_PYTHON_MODULE(hello) 
{ 
    class_<World>("World") 
    .def("greet", &World::greet) 
    .def("set", &World::set) 
    ; 
} 

Antwort

0

Unabhängig davon, ob Sie GCC/G ++ korrekt installiert haben, baut MacPorts immer seine C++ - Software gegen libC++ auf Systemen, auf denen call standardmäßig mit libC++ kompiliert wird.

Das bedeutet, dass Ihre MacPorts-Version von Boost mit libC++ kompiliert wurde, was bedeutet, dass Sie sie nicht mit GCC/G ++ verwenden können (es sei denn, Sie springen durch einige zusätzliche Schleifen libC++ mit GCC).

Trotz Ihrer Vermutung, dass Ihr Problem nicht das ist, was Sie in dem anderen Beitrag beschrieben haben, den Sie verlinkt haben, ist es genau das. Ihre Optionen sind:

  • Verwenden Klirren ++
  • Erstellen Sie Ihre eigene Kopie-Boost mit g ++