На моем рабочем месте есть проект, состоящий из множества приложений, которые нужно создавать как для ARM, так и для x86.Версия ARM прекрасно работает с кросс-цепочкой Marvell GCC 4.8.5.Сейчас я работаю над сборкой x86 (GCC версии 4.8.5-4ubuntu8) и получил несколько неопределенных ошибок ссылок в одном приложении.К сожалению, я не смог ни поделиться источниками (может быть, только их фрагментами), ни сделать минимальный пример, который показывает ошибку, но я провел небольшое исследование по этой проблеме, и вот что я нашел.
ОшибкаНа этапе связывания приложения отображаются следующие ошибки:
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xc0): undefined reference to `non-virtual thunk to <...>::OnBeforeRun()'
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xc8): undefined reference to `non-virtual thunk to <...>::OnRun()'
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xd0): undefined reference to `non-virtual thunk to <...>::OnAfterRun()'
src/<...>.o: In function `<...>::Application(<...>::Runtime&, <...>::SystemFacilityCollection&, <...>::Logger&, char const*, int, char const**)':
<...>/dhcconf.cxx:11: undefined reference to `<...>::Name() const'
src/<...>.o: In function `main':
<...>/main.cxx:21: undefined reference to `<...>::Syslog(std::string const&)'
collect2: error: ld returned 1 exit status
Не знаю, что делать с ведущими ошибками «не виртуального блокада» (это еще один вопрос, но сейчас давайте их проигнорируем), но о последних двухошибки У меня есть несколько советов о том, что их вызвало.
Я нашел библиотеку, содержащую функции, ссылки на которые не удалось разрешить (<...>::Name
из <...>/dhcconf.cxx:11
и <...>::Syslog
из <...>/main.cxx:21
)и перечисленные в нем символы (конечно, эта библиотека правильно указана с флагом -l
):
$ nm --demangle --dynamic --defined-only --extern-only <...>.so | grep Name
0000000000245956 T <...>::Name[abi:cxx11]() const
$ nm --demangle --dynamic --defined-only --extern-only <...>.so | grep Syslog
000000000025e392 T <...>::Syslog(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
Существует много других символов из этой библиотеки, которые также содержат спецификатор [abi:cxx11]
и используют типы __cxx11
, но кажется, что целевое приложение не использует их, и я уверен, что именно эти вещи, связанные с cxx11, вызывают ошибки.
Сломанное приложение создается с флагом -std=gnu++0x
.Попытка создать библиотеку, которая содержит нужные символы с -D_GLIBCXX_USE_CXX11_ABI=0
, делает сборку целевого приложения хорошей, но ломает несколько других приложений, так что это не так.Других способов исправить эту ошибку я не смог найти.
Может кто-нибудь мне помочь с этой проблемой?Заранее спасибо.