شرح - string functions in c++




تحويل std::__ cxx11:: string إلى std:: string (4)

أستخدم c ++ 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'

إذا كان بإمكانك إعادة ترجمة جميع الكتب غير المتوافقة التي تستخدمها ، فقم بذلك باستخدام خيار برنامج التحويل البرمجي

-D_GLIBCXX_USE_CXX11_ABI = 1

ثم قم بإعادة بناء المشروع الخاص بك. إذا لم تتمكن من القيام بذلك ، فأضف إلى خيار برنامج التحويل البرمجي makefile الخاص بمشروعك

-D_GLIBCXX_USE_CXX11_ABI = 0

تحديد

#define _GLIBCXX_USE_CXX11_ABI 0/1

هي أيضًا جيدة ولكن ربما تحتاج إلى إضافتها إلى جميع ملفاتك بينما يقوم برنامج التحويل البرمجي بفعل ذلك لجميع الملفات مرة واحدة.


بالنسبة لي -D_GLIBCXX_USE_CXX11_ABI = 0 لم يساعد.

إنه يعمل بعد ربط إصدار C ++ libs بدلاً من gnustl.


عندما واجهت مشكلة مشابهة ، فقد تم إنشاء lib باستخدام clang++ ، وهو مرتبط بـ libstdc++.so افتراضيًا على libstdc++.so . بينما تم بناء التطبيق الثنائي باستخدام -lc++ وربطه مع الخيار -lc++ .

أسهل طريقة للتحقق من التبعيات هي إجراء ldd libName.so

لإصلاحها ، يجب عليك استخدام نفس المكتبة في التطبيق والمكتبة.

  • أسهل طريقة. بناء مكتبة باستخدام clang++ وتطبيق الترجمة باستخدام clang++ . بدون خيارات ربط إضافية في كلا الخطوتين. سيتم استخدام stdlib الافتراضي.

  • -stdlib=c++ مكتبة باستخدام -stdlib=c++ وقم بترجمة التطبيق باستخدام -lc++ . في هذه الحالة ، ستستخدم كل من المكتبة والتطبيق libc++.so .

  • بناء مكتبة دون خيارات إضافية وربط ثنائي -lstdc++ . في هذه الحالة ، ستستخدم كل من المكتبة والتطبيق libstdc++.so .


لقد حصلت على هذا ، الطريقة الوحيدة التي وجدت لإصلاحها هي تحديث mingw-64 (قمت بهذا باستخدام pacman على msys2 لمعلوماتك).







std