2009-02-17 3 views
6

Je suis en train de compiler mon programme qui utilise regex sur linux. J'ai construit la bibliothèque boost dans le libs/regex/build en tapant make -fgcc.mak qui a créé un gcc répertoire contenant les quatre fichiers suivantslien pour booster regex dans gcc

boost_regex-gcc-1_35 
boost_regex-gcc-d-1_35 
libboost_regex-gcc-1_35.a 
libboost_regex-gcc-d-1_35.a 

Maintenant, je veux utiliser mon programme de regex qui est dans un répertoire arbitraire. I #include boost/regex.hpp

J'ai reçu l'erreur indiquant que regex.hpp est introuvable. Puis j'ai donné l'option -I dans le compilateur g ++. Je n'ai pas eu cette erreur. Mais je reçois l'erreur suivante

undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)' 

Je googlé et trouvé que je dois relier en quelque sorte l'un des 4 ci-dessus bibliothèques à mon programme. Comment puis-je le faire. Lequel dois-je lier et pourquoi?

Répondre

9

Vous pouvez ajouter libboost_regex-gcc-1_35.a à votre liste de fichiers objet dans votre étape de liaison ou ajouter -static -lboost_regex-gcc-1_35 à la même. Assurez-vous également que vous disposez d'un commutateur -I pointant vers votre répertoire Boost inclus dans votre étape de compilation. Si les bibliothèques sont en dehors du chemin de recherche typique (/usr/lib sur * nix), ajoutez ce répertoire à votre commande de lien avec -Wl,-L/path/to/boost/libs pour g++ ou simplement -L/path/to/boost/libs sur ld.

0

J'ai également rencontré des problèmes similaires lors de l'utilisation du système de fichiers boost. Voici ce que je devais faire pour le lier statiquement.

Extrait de mon original (problématique) Makefile: LIBS = -static -lboost_filesystem

Solution: LIBS = -Wl, -Bstatic -lboost_filesystem -lboost_system -Wl, -Bdynamic

Vous pouvez voir le Makefile complet à partir de http://code.google.com/p/neptuner/source/browse/codebase/trunk/stratego/uboat/Makefile

Nécessaire d'ajouter boost_system pour le lier correctement. L'ajout/spécification directe de libboost * .a a créé plus de problèmes. Notez que -Bdynamic est présent pour empêcher le lien statique des bibliothèques standard.