Преобразование 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'
Ответы
Ответ 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.