2016-07-27 3 views
0

Je tente de suivre les Exposing Classes tutorial pour Boost.Python sur Boost.org. J'ai déjà fait le first tutorial avec succès et en commentant le code, l'erreur se produit dès que la classe apparaît. La partie où tout s'effondre est en train de créer le fichier .so à partir du fichier .cpp. Je reçois l'apparemment commun: 'Undefined symbols for architecture x86_64:'. J'ai vérifié plusieurs questions à ce sujet et tout n'avait essentiellement rien à voir avec mon cas. Je suis sur OSX 10.11.6 et j'ai utilisé macports pour installer boost, et gcc6. J'ai tout mis en place donc j'utilise réellement gcc et g ++ au lieu de clang. C'est pourquoi je ne crois pas que mon problème est related to this one parce que j'utilise le vrai g ++, je ne devrais pas avoir affaire à ce problème de libstC++ et de libC++, si je suis correct dans ma compréhension. Tous mes paquets de macports, et macports lui-même sont à jour. Quelqu'un veut-il partager son point de vue?Création de .so à partir de .cpp: Symboles non définis pour l'architecture x86_64: Boost.Python MacPorts GCC6 pas Clang

Quand je lance la commande pour créer le .donc: (Je crois que je dois manquer un lien vers un lib Boost, mais je ne sais pas ce qu'il est)

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

Je suis un peu avertissement et un court message d'erreur, mais le fichier hello.so.dSYM est créé et enregistré dans le répertoire:

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

Mon code cpp est exactement le même que celui indiqué dans ce tutoriel:

#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) 
    ; 
} 

Répondre

0

Indépendamment de l'installation correcte de GCC/G ++, MacPorts construit toujours son logiciel C++ sur libC++ sur les systèmes où clang compilerait avec libC++ par défaut. Cela signifie que votre version MacPorts de Boost est compilée avec libC++, ce qui signifie que vous ne pouvez pas l'utiliser avec GCC/G ++ (à moins de passer par des cerceaux supplémentaires pour utiliser libC++ avec GCC).

En dépit de votre supposition que votre problème n'est pas ce que vous avez décrit dans l'autre poste que vous avez lié, c'est exactement cela. Vos options sont:

  • utilisation clang ++
  • Construisez votre propre copie de Boost avec g ++