2016-01-24 2 views
6

У меня возникла проблема с новым ABI, введенным для C++ 11 в GCC. После обновления до GCC 5.3 мой проект больше не компилируется. Сообщения об ошибках, которые я получаю, просто:G ++ новые проблемы с ABI

undefined reference to `tokenize(std::__cxx11::basic_string' ...more characters 

или

undefined reference to `extract(std::string const&)' 

Итак, похоже, что я испортил что-то и GCC не может решить, хочу ли я старый ABI или новый один (__cxx11:: часть отсутствует в некоторых сообщениях об ошибках и присутствует в других)?

Я попробовал несколько решений для решения этой проблемы:

  • проходящее -D_GLIBCXX_USE_CXX11_ABI=0 к НКУ,
  • проходя -D_GLIBCXX_USE_CXX11_ABI=1 к НКУ,
  • установки макроса непосредственно в исходном коде,
  • установки атрибута abi_tag по заявкам GCC жаловался, когда был принят флаг -Wabi-tag,

К сожалению, ни одна из них не работала (т. разрешить компиляцию кода). Единственное, что я знаю, это то, что только функции, возвращающие std::string или принимающие его как параметр, не могут связываться. Что и следовало ожидать, учитывая то, что я прочитал о проблеме в Интернете. Я не смог воспроизвести проблему в простой примерной программе, чтобы представить ее здесь.

Есть ли очевидное решение моей проблемы, что мне не хватает?

+2

Это ошибка компоновщика, а не ошибка компилятора. Это предполагает, что скомпилированные объекты и библиотеки, которые вы пытаетесь связать, были скомпилированы с различными ABI. – rici

+0

@rici Да, вы правы. Я знаю, что проблема возникает во время связывания. Однако компилятор испускает код, который должен быть связан (или мое понимание не хватает?). Я не знаю, почему G ++ иногда испускает код, используя новый, а иногда и старый ABI, даже когда я делаю полные перекомпиляции кода. – Mael

ответ

8

Эта ошибка указывает на то, что вы ссылаетесь на какой-либо код или библиотеку, которая не была перекомпилирована gcc 5.3, и была скомпилирована более ранней версией gcc, используя более раннюю версию ABI.

Если вы связываетесь с некоторыми внешними библиотеками, помимо стандартной библиотеки C++, эти внешние библиотеки необходимо перекомпилировать (и переустановить).

Если вы не связываетесь с любыми внешними библиотеками, и вы связываете только свой собственный код, некоторые из ваших исходных модулей еще не перекомпилированы. Перекомпилируйте все. Обязательно протрите все существующие объектные модули с помощью make clean или эквивалентом для любой используемой системы сборки.

+0

Я связываю только свой собственный код. Я также 'make clean''d и' make recompile''d.Turns out У меня, должно быть, ошибка в моем Makefile. После того, как я вручную удалил все файлы .o, у меня получилась хорошая, чистая, тестовая передача. Я принимаю ваш ответ. Благодаря! – Mael

+0

Интересно, каково было ваше окончательное решение. Нужно ли добавлять abi-теги вручную к любым классам или методам? Интересно, может ли старый код просто скомпилироваться по-прежнему (сбой abi без каких-либо ошибок) – Georg

+0

@Georg Извините за * очень * поздний ответ. Мне не нужно было ничего делать, просто перекомпилировать. Оказалось, что у меня была ошибка в моем Makefile (написанная от руки), и она удаляла все файлы .o; поэтому у меня была смесь файлов, которые были скомпилированы с использованием старого ABI и нового. Оказывается, на самом деле это не было загадочным.Старый код «можно просто скомпилировать как прежде», не нарушая ABI. – Mael

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