将 __cxx11::string 转换为 std::string:处理不兼容库的指南
遇到 std::__cxx11 之间的不兼容性: :string 类型和常规 std::string 可能是一个令人沮丧的问题。当尝试与可能未针对 C 11 配置的库进行交互时,需要在这些类型之间进行转换。然而,仅仅尝试使用 (string) 将 std::__cxx11::string 转换为 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'
了解 Ursache:
造成这种情况的一个可能原因不兼容性在于 GCC 5 的使用。GCC 5 为 C 标准库引入了双 ABI,其中使用一种 ABI 编译的代码无法与使用另一种 ABI 编译的代码链接。如果第三方库是使用较旧的 ABI 编译的,而您的代码使用较新的 ABI,则可能会出现链接问题。
解决方案:
解决此问题,在包含任何标准库头之前将宏 _GLIBCXX_USE_CXX11_ABI 定义为 0。这会强制 GCC 使用较旧的 ABI,确保与第三方库的兼容性。
#define _GLIBCXX_USE_CXX11_ABI 0 #include <iostream> #include <string>
定义此宏后,链接器应该能够成功解析符号以及从 std::__cxx11 的转换::string 到 std::string 应该不会出现错误。
以上是如何解决链接库时 `std::__cxx11::string` 和 `std::string` 不兼容问题?的详细内容。更多信息请关注PHP中文网其他相关文章!