2013-10-10 1 views
2

Я получаю ошибки «неопределенной ссылки» в 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 до конца команды? Почему удаление этой, по-видимому, несвязанной библиотеки исправить? Почему другие программы связаны без каких-либо проблем?

+0

- это ваш каталог libboost_regex.so в пути/toMyLibs? Возможно, вам нужно указать путь в команде g ++. – billz

+0

Допустимо, почему добавление 'MyUI' в ссылку вызывает недостоверную ссылку в' MyBusinessLogic'? – Oswald

+0

@billz - Нет, он использует системный libboost_regex.so. (Я даже запустил его под 'strace' для проверки.) –

ответ

2

Я выяснил, по крайней мере, большую часть ответа. Из-за некоторой небрежности в моих правилах makefile libMyUI.so был связан с boost_regex, но libMyBusinessLogic.so не было. Я предполагаю, что в результате связь MyUI вызвала boost_regex, прежде чем линкер знал все символы, которые ему понадобились бы MyBusinessLogic.

Пока я согласен - либо все My*.so ссылки с boost_regex, либо ни одна из них не работает - все работает. Я не уверен, какое из этих решений является наиболее предпочтительным, но, по крайней мере, у меня есть исправление.

+1

+1 для нахождения этого. Наверное, это было нелегко, и я могу представить, какие шаги вам нужно предпринять, чтобы, наконец, обнаружить недостающую зависимость ссылок в вашем make-файле. – WhozCraig

 Смежные вопросы

  • Нет связанных вопросов^_^