У меня возникла проблема с новым 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
или принимающие его как параметр, не могут связываться. Что и следовало ожидать, учитывая то, что я прочитал о проблеме в Интернете. Я не смог воспроизвести проблему в простой примерной программе, чтобы представить ее здесь.
Есть ли очевидное решение моей проблемы, что мне не хватает?
Это ошибка компоновщика, а не ошибка компилятора. Это предполагает, что скомпилированные объекты и библиотеки, которые вы пытаетесь связать, были скомпилированы с различными ABI. – rici
@rici Да, вы правы. Я знаю, что проблема возникает во время связывания. Однако компилятор испускает код, который должен быть связан (или мое понимание не хватает?). Я не знаю, почему G ++ иногда испускает код, используя новый, а иногда и старый ABI, даже когда я делаю полные перекомпиляции кода. – Mael