Подтвердить что ты не робот

Преобразование std:: __ cxx11:: string в std::string

Я использую С++ 11, но также некоторые библиотеки, которые не настроены для него, и нуждаются в некотором преобразовании типов. В частности, мне нужен способ преобразования std::__cxx11::string в обычный std::string, но googling. Я не могу найти способ сделать это, а установка (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'
4b9b3361

Ответ 1

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

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

Источник: Примечания к выпуску GCC 5/Dual ABI

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

Ответ 2

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

-D_GLIBCXX_USE_CXX11_ABI = 1

а затем перестройте свой проект. Если вы не можете этого сделать, добавьте в свой проект компилятор makefile

-D_GLIBCXX_USE_CXX11_ABI = 0

Определить

#define _GLIBCXX_USE_CXX11_ABI 0/1

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

Ответ 3

Ответы здесь в основном сосредоточены на кратком способе его исправить, но если это не поможет, я дам несколько шагов, чтобы проверить, что мне помогло (только для Linux):

  • Если при компоновке других библиотек возникают ошибки компоновщика, создайте эти библиотеки с помощью символов отладки (флаг GCC "-g")
  • Перечислите символы в библиотеке и наберите символы, на которые жалуется компоновщик (введите команды в командной строке):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • Если вы получили сигнатуру метода, переходите к следующему шагу, если у вас no symbols вместо этого, скорее всего, вы удалили все символы из библиотеки, и поэтому компоновщик не может найти их при компоновке библиотеки. Перестройте библиотеку без удаления ВСЕХ символов, при необходимости вы можете удалить символы отладки (опция strip -S).

  • Используйте demangler c++, чтобы понять сигнатуру метода, например, этот

  • Сравните сигнатуру метода в библиотеке, которую вы только что получили, с сигнатурой, которую вы используете в коде (также проверьте файл заголовка), если они отличаются, используйте правильный заголовок или соответствующую библиотеку или любой другой способ, которым вы теперь знаете, чтобы исправить это

Ответ 4

Когда у меня возникла похожая проблема, это произошло из-за того, что моя библиотека была собрана с использованием clang++, и она по умолчанию связывалась с libstdc++.so в моей системе. Бинарный файл приложения был собран с использованием clang и связан с опцией -lc++.

Самый простой способ проверить зависимости - это выполнить ldd libName.so

Чтобы это исправить, вы должны использовать одну и ту же библиотеку в приложении и библиотеке.

  • Самый простой способ. Создайте библиотеку, используя clang++, и скомпилируйте приложение, используя clang++. Без дополнительных ссылок на оба шага. Будет использоваться стандартный stdlib.

  • Создайте библиотеку с помощью -stdlib=c++ и скомпилируйте приложение с помощью -lc++. В этом случае и библиотека, и приложение будут использовать libc++.so.

  • Соберите библиотеку без дополнительных опций и свяжите бинарный файл с -lstdc++. В этом случае и библиотека, и приложение будут использовать libstdc++.so.

Ответ 5

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

Ответ 6

Для меня -D_GLIBCXX_USE_CXX11_ABI = 0 не помогло.

Он работает после того, как я связался с версией C++ libs вместо gnustl.