Ссылки для повышения регулярных выражений в GCC
Я пытаюсь скомпилировать мою программу, которая использует регулярные выражения в Linux. Я собрал библиотеку boost в libs/regex/build, набрав make -fgcc.mak, которая создала каталог 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
Теперь я хочу использовать регулярные выражения из моей программы, которая находится в произвольном каталоге. Я включил boost/regex.hpp
Я получил ошибку, в которой говорилось, что regex.hpp не найден. Затем я дал опцию -I в компиляторе g++. Я не получил эту ошибку. Но я получаю следующую ошибку
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)'
Я гуглил и обнаружил, что мне нужно как-то связать одну из вышеуказанных 4 библиотек с моей программой. Как мне это сделать. Который я должен связать и почему?
2 ответа
Либо добавить libboost_regex-gcc-1_35.a
в ваш список объектных файлов в шаге ссылки или добавить -static -lboost_regex-gcc-1_35
к тому же. Также убедитесь, что у вас есть -I
Переключатель, указывающий на вашу надстройку, включает каталог на этапе компиляции. Если библиотеки находятся за пределами типичного пути поиска (/usr/lib
в *nix), добавьте этот каталог к вашей команде -Wl,-L/path/to/boost/libs
за g++
или просто -L/path/to/boost/libs
на ld
,
Я также сталкивался с подобными проблемами при использовании файловой системы boost. Вот что мне нужно было сделать, чтобы статически связать его.
Выдержка из моего оригинального (проблемного) файла Makefile: LIBS = -static -lboost_filesystem
Решение: LIBS = -Wl,-Bstatic -lboost_filesystem -lboost_system -Wl,-Bdynamic
Вы можете просмотреть полный Makefile с http://code.google.com/p/neptuner/source/browse/codebase/trunk/stratego/uboat/Makefile
Нужно добавить boost_system для правильной ссылки. Прямое добавление / спецификация libboost*.a создает больше проблем. Обратите внимание, что -Bdynamic присутствует для предотвращения статической связи стандартных библиотек.