2016-02-22 3 views
2

Вот и проблема: используемый мной код использует большую библиотеку, которая связывает с boost. Когда я компилирую статическую ссылку, все работает нормально. Однако, когда я пытаюсь выполнить динамическое связывание, я получаю кучу неопределенных опорных ошибок. Первая мысль была, очевидно, «я не связываю библиотеку boost program_options», но я посмотрел, и она есть в команде связывания (и она приходит после библиотеки, которая в ней нуждается). Среди различных ошибок, хотя, это выделялось:Ошибка компоновки Boost: отсутствуют символы 'B5cxx11'

undefined reference to `_ZN5boost15program_options3argB5cxx11E 

В моей повседневной жизни, связывая ошибки, как правило, в форме «неопределенная ссылка на SomeFunction (...)». Поэтому я пошел в папку установки моей библиотеки boost и использовал readelf, чтобы увидеть, какие символы у меня есть в библиотеке libboost_program.so. И на самом деле этот символ не появляется. Вместо этого ближайший я нашел _ZN5boost15program_options3argE.

Google-немного, я узнал, что дополнительная часть B5cxx11 - это новое дополнение к названию, называемому C++ 11. Похоже, что boost (по крайней мере, версия 1.59.0) еще не поддерживает это новое название.

Так что мой вопрос: это известная проблема? Какое обходное решение существует? И почему эта проблема не появляется со статической связью?

Редактировать: Если кто-то споткнется на этот вопрос в будущем, я просто попытался повысить 1.60.0, а символы содержат строку B5cxx11. Я верю (читайте: надеюсь), это решит проблему. Однако, как двойная проверка, я собираюсь снова перекомпилировать boost 1.59.0, чтобы узнать, связано ли это с тем, что я изменил в своей среде (хотя я сомневаюсь).

+0

Вы когда-нибудь узнавали, в чем проблема? – pzelasko

ответ

0

Это не то, что поддержка должна поддерживать, ваш компилятор/линкер имеет. Вероятно, ваша библиотека была скомпилирована с поддержкой C++ 11, и это было вашим усилением, но ваша текущая программа - нет. Попробуйте с опцией --std=c++11, если вы находитесь в GCC.

Или, может быть, это наоборот, и вы создаете шаблон в своем C++ 11, который использует сглаживание имени C++ 11 и не может найти функции библиотеки в компиляторе, отличном от C++ (хотя это будет связано с ошибкой компилятора).

+0

Исполняемый файл должен быть скомпилирован с помощью '--std = C++ 11', поскольку он использует некоторые из этих функций, и я никогда не получал жалобы. Кроме того, флаг должен быть унаследован от связанных библиотек через cmake. Но я попробую добавить его явно и посмотреть, что произойдет. – bartgol

+0

Я проверил, и я уже явно указывал cmake, чтобы добавить этот флаг к уже существующим флагам cxx ... – bartgol

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