2009-02-17 5 views
6

Ich versuche, mein Programm zu kompilieren, die Regex auf Linux verwendet. Ich baute die Boost-Bibliothek in der libs/regex/build von make -fgcc.mak eingeben, die ein Verzeichnis gcc erstellt, die die folgenden vier DateienVerknüpfung zu Boost Regex in 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 

Nun enthält ich Regex von meinem Programm verwenden möchten welches in irgendeinem willkürlichen Verzeichnis ist. I #included boost/regex.hpp

Ich habe den Fehler, der besagt, dass regex.hpp nicht gefunden wird. Dann gab ich die Option -I im g ++ - Compiler. Ich habe diesen Fehler nicht bekommen. aber ich bekomme die folgenden Fehler

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)' 

ich gegoogelt und fand, dass ich irgendwie eine der oben genannten 4-Bibliotheken zu meinem Programm verknüpfen muß. Wie kann ich es tun. Welchen sollte ich verlinken und warum?

Antwort

9

Fügen Sie entweder libboost_regex-gcc-1_35.a zu Ihrer Liste von Objektdateien in Ihrem Verknüpfungsschritt hinzu oder fügen Sie -static -lboost_regex-gcc-1_35 hinzu. Stellen Sie außerdem sicher, dass Sie einen -I-Switch haben, der auf Ihr Boost-Include-Verzeichnis in Ihrem Kompilierungsschritt zeigt. Wenn sich die Bibliotheken außerhalb des typischen Suchpfads befinden (/usr/lib on * nix), fügen Sie dieses Verzeichnis Ihrem Linkbefehl mit -Wl,-L/path/to/boost/libs für g++ oder einfach -L/path/to/boost/libs unter ld hinzu.

0

Ich sah auch ähnliche Probleme bei der Verwendung von Boost-Dateisystem. Hier ist, was ich tun musste, um es statisch zu verbinden.

Auszug aus meinem Original (problematisch) Makefile: LIBS = -static -lboost_filesystem

Lösung: LIBS = -Wl, -Bstatic -lboost_filesystem -lboost_system -Wl, -Bdynamic

können Sie sehen das komplette Makefile von http://code.google.com/p/neptuner/source/browse/codebase/trunk/stratego/uboat/Makefile

Benötigt, boost_system hinzufügen, um es richtig zu verknüpfen. Die direkte Hinzufügung/Spezifikation von libboost * .a hat zu mehr Problemen geführt. Beachten Sie, dass die -Bdynamic vorhanden ist, um statische Verbindungen von Standardbibliotheken zu verhindern.