Я получаю ошибки «неопределенной ссылки» в ld и не понимаю, что их вызывает.Неопределенные эталонные ошибки из ненужной библиотеки
Мой Makefile строит несколько исполняемых файлов с помощью команд, как это:
g++ -ogui_program1 -Lpath/to/MyLibs gui_program1.o -lMyUI -lMyBusinessLogic \
-lMyUtil -lboost_regex
g++ -ogui_program2 -Lpath/to/MyLibs gui_program2.o -lMyUI -lMyBusinessLogic \
-lMyUtil -lboost_regex
g++ -ocli_program1 -Lpath/to/MyLibs cli_program1.o -lMyUI -lMyBusinessLogic \
-lMyUtil -lboost_regex
g++ -ocli_program2 -Lpath/to/MyLibs cli_program2.o -lMyUI -lMyBusinessLogic \
-lMyUtil -lboost_regex
И так далее. (На самом деле, есть довольно еще несколько библиотек, чем это, но это общая идея.)
MyUI
, MyBusinessLogic
и MyUtil
все динамические библиотеки, которые я уже построены. Для упрощения написания make-файла один и тот же список библиотек используется как для графического интерфейса, так и для программ командной строки, хотя программам командной строки не требуется libMyUI.so
.
Один и только один из программ командной строки дают многочисленные ошибки о неопределенных ссылках на символы библиотеки Boost.regex при попытке связать его, даже если я связывая -lboost_regex
с каждым двоичным:
libMyBusinessLogic.so: undefined reference to `boost::re_detail::perl_matcher >, boost::regex_traits > >::construct_init(boost::basic_regex > > const&, boost::regex_constants::_match_flags)'
libMyBusinessLogic.so: undefined reference to `boost::cpp_regex_traits::toi(char const*&, char const*, int) const'
libMyBusinessLogic.so: undefined reference to `boost::re_detail::perl_matcher, std::allocator > >, std::allocator, std::allocator > > > >, boost::regex_traits > >::match()'
libMyBusinessLogic.so: undefined reference to `boost::re_detail::perl_matcher, std::allocator > >, std::allocator, std::allocator > > > >, boost::regex_traits > >::construct_init(boost::basic_regex > > const&, boost::regex_constants::_match_flags)'
libMyBusinessLogic.so: undefined reference to `boost::re_detail::perl_matcher, std::allocator > >, std::allocator, std::allocator > > > >, boost::regex_traits > >::find()'
libMyBusinessLogic.so: undefined reference to `boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
libMyBusinessLogic.so: undefined reference to `boost::re_detail::perl_matcher >, boost::regex_traits > >::match()'
Связывание всех других программ отлично работает. Если я удалю -lMyUI
из одной командной строки, то он отлично работает, хотя MyUI
не отображается нигде в списке ошибок.
Почему не ld находит символы Boost.Regex, когда я добавил -lboost_regex
до конца команды? Почему удаление этой, по-видимому, несвязанной библиотеки исправить? Почему другие программы связаны без каких-либо проблем?
- это ваш каталог libboost_regex.so в пути/toMyLibs? Возможно, вам нужно указать путь в команде g ++. – billz
Допустимо, почему добавление 'MyUI' в ссылку вызывает недостоверную ссылку в' MyBusinessLogic'? – Oswald
@billz - Нет, он использует системный libboost_regex.so. (Я даже запустил его под 'strace' для проверки.) –