2015-10-28 3 views
42

Я использую C++ 11, но также некоторые библиотеки, которые не настроены для него, и нуждаются в некотором преобразовании типов. В частности, мне нужен способ конвертировать std::__cxx11::string в обычный std::string, но googling Я не могу найти способ сделать это, и поставить (string) спереди не получится.Преобразование std :: __ cxx11 :: string to std :: string

Если я не конвертируются я получаю ошибки компоновщика, как это:

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const' 
+1

Ошибка звучит скорее как компилятор не может найти метод 'insertMember()'. –

+1

Хм, он может найти его с другими программами, которые у меня есть, которые не используют 'C++ 11' – jorgen

+0

На самом деле это, скорее всего, компоновщик, а не компилятор. Что означает «найти», что это за «другие программы»? –

ответ

57

это возможно, что вы используете GCC 5?

Если вы получаете ошибки компоновщика о неопределенных ссылок на символы, которые включают типы в станд :: __ cxx11 пространства имен или тег [аби: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать вместе файлы, которые были скомпилированы объект с разными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

Источник: GCC 5 Release Notes/Dual ABI

Определение следующего макрос до того включая любые стандартные библиотеки заголовки должны исправить вашу проблему: #define _GLIBCXX_USE_CXX11_ABI 0

+1

Я пробовал это; теперь я получаю ошибки компоновщика везде, где я использую функции C++ 11. Может быть, нет способа заставить это работать как с C++ 11, так и с компилируемой библиотекой hdf5. – jorgen

+0

Для меня, по Ubuntu 14.04, g ++ 6.2 компилируется по умолчанию с этим набором в 0, а в 16.04 - с той же версией g ++, с которой она установлена ​​в 1. На 14.04 установка этого значения в 1, похоже, ничего не делает; результирующий объектный файл не использует ABI CXX11. Я подозреваю, что это системное ограничение. –

+0

Я не был уверен, почему компилятор бросает 'undefined reference' и перед поиском решения я проверил всю свою связь в программе и ничего не нашел. После этого я решил искать в Интернете и нашел это. Это работает как шарм, спасибо :) – Shravan40

29

Если вы можете перекомпилировать весь несовместимый LIBS вы используете, сделать это с опцией компилятора

-D_GLIBCXX_USE_CXX11_ABI = 1

, а затем перестройте свой проект. Если вы не можете сделать так, чтобы добавить опцию Makefile компилятор вашего проекта

-D_GLIBCXX_USE_CXX11_ABI = 0

Определить

#define _GLIBCXX_USE_CXX11_ABI 0/1

также хорош, но вы, вероятно, должны добавить его ко всем своим файлам, в то время как опция компилятора делает это для всех файлов одновременно.

+1

Ящик компилятора работал для меня. Благодарю. Я потратил 4 дня на это глупое изменение в gcc! –

+0

Спасибо. Этот флаг также работал для меня – hbobenicio

0

Я получил это, единственный способ, которым я нашел, чтобы исправить это было, чтобы обновить все mingw-64 (я сделал это, используя pacman на msys2 для вашей информации).

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