C++ 将std::uu cxx11::string转换为std::string

C++ 将std::uu cxx11::string转换为std::string,c++,string,c++11,types,std,C++,String,C++11,Types,Std,我使用c++11,但也使用一些未配置的库,并且需要一些类型转换。特别是我需要一种方法将std::uucxx11::string转换为常规std::string,但谷歌搜索我找不到一种方法来实现这一点,并且将(string)放在前面不起作用 如果不转换,则会出现如下链接器错误: undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char

我使用c++11,但也使用一些未配置的库,并且需要一些类型转换。特别是我需要一种方法将
std::uucxx11::string
转换为常规
std::string
,但谷歌搜索我找不到一种方法来实现这一点,并且将
(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'
对'H5::CompType::insertMember(std:u cxx11::basic_string const&,无符号长,H5::DataType const&)const'的未定义引用

您是否可能正在使用GCC 5

如果出现链接器错误,即未定义对涉及std::\u cxx11命名空间或标记[abi:cxx11]中类型的符号的引用,则可能表示您正在尝试将使用不同值为_GLIBCXX\u USE\u cxx11\u abi宏编译的对象文件链接在一起。这通常发生在链接到使用较旧版本的GCC编译的第三方库时。如果无法使用新的ABI重建第三方库,则需要使用旧的ABI重新编译代码

资料来源:


在之前定义以下宏,包括任何标准库头,应该可以解决您的问题:
\define\u GLIBCXX\u USE\u cx11\u ABI 0
如果您可以重新编译您使用的所有不兼容库,请使用编译器选项执行此操作

-D_GLIBCXX_使用_CXX11_ABI=1

然后重建您的项目。如果不能这样做,请添加到项目的makefile编译器选项

-D_GLIBCXX_使用_CXX11_ABI=0

定义

#定义\u GLIBCXX\u使用\u CXX11\u ABI 0/1


也很好,但您可能需要将其添加到所有文件中,而编译器选项一次对所有文件执行此操作。

我得到了这个问题,我发现解决此问题的唯一方法是更新所有mingw-64(我使用msys2上的pacman进行了此操作,以供参考)。

对我来说-D_GLIBCXX_使用_CXX11_ABI=0没有帮助


它是在链接到C++ LIBS版本而不是GNUSTL之后工作的。

< P>这里的答案主要集中在修复它的短方法上,但是如果没有帮助,我会给出一些步骤来检查,这对我帮助(仅Linux):

  • 如果链接其他库时发生链接器错误,请使用调试符号(“-g”GCC标志)构建这些lib
  • 列出库中的符号,并grep链接器抱怨的符号(在命令行中输入命令):

    nm lib\u您的问题\u库。一个| grep functionname链接complainsabout

  • 如果您得到了方法签名,请继续下一步,如果您得到的是
    没有符号
    ,则很可能是您从库中剥离了所有符号,这就是链接器在链接库时无法找到它们的原因。在不剥离所有符号的情况下重建库,如果需要,可以剥离调试(
    strip-S
    option)符号

  • > P>使用C++ Dimangle理解方法签名,例如

  • 将您刚得到的库中的方法签名与您在代码中使用的方法签名进行比较(同时检查头文件),如果它们不同,请使用适当的头或适当的库或您现在知道的任何其他方法来修复它们

当我遇到类似问题时,会发生这种情况,因为我的lib是使用
clang++
构建的,并且它链接到
libstdc++。因此默认情况下,在我的系统上。而应用程序二进制文件是使用
clang
构建的,并与
-lc++
选项链接

检查依赖关系的最简单方法是执行
lddlibname.so

要修复它,您应该在应用程序内和库上使用相同的库

  • 最简单的方法。使用
    clang++
    构建库,并使用
    clang++
    编译应用程序。在两个步骤上都没有额外的链接选项。将使用默认的stdlib

  • 使用
    -stdlib=c++
    构建库,并使用
    -lc++
    编译应用程序。在这种情况下,库和应用程序都将使用
    libc++.so

  • 不使用额外选项构建库,并将二进制文件链接到
    -lstdc++
    。在这种情况下,库和应用程序都将使用
    libstdc++.so


我最近在尝试链接Ubuntu 16.04上的hdf5 1.10.5版的预构建二进制文件时遇到了类似的问题。这里建议的解决方案都不适合我,我使用的是g++9.1版。我发现最好的解决方案是从源代码构建hdf5库。不要使用预构建的二进制文件,因为它们是使用GCC4.9构建的!相反,从hdf下载特定发行版的源代码存档并构建库。这很容易


如果您的系统上还没有压缩库,您还需要分别从和中获取压缩库zlibszip

在我的情况下,我遇到了类似的问题:

/usr/bin/ld: Bank.cpp:(.text+0x19c): undefined reference to 'Account::SetBank(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' collect2: error: ld returned 1 exit status

使用上面的命令,它能够正确地链接头、实现和主C++文件。


OBS:My g++version:9.3.0(在Ubuntu 20.04上)

这个错误听起来更像是编译器找不到
insertMember()
方法。嗯,它可以通过我的其他不使用
c++11
的程序找到它。另外,我猜你在使用gcc。我希望在字符串头的
std
名称空间的某个地方有一些
typedef\uuucx11::basic\ustring basic\ustring
。您是否也编译了包含
H5::CompType
的编译单元?“我使用c++11,但也使用一些未为其配置的库”。这种情况是有问题的,你不能指望这些东西真的起作用。等等。我在排除故障后找到了解决这个问题的方法,所以我想与大家分享一下,问题是我使用了
gcc
而不是
g++
来编译…我尝试了这个;现在,无论我在哪里使用c++11函数,都会出现链接器错误。也许在c++11和已编译的hdf5库中都无法实现这一点
g++ Bank.cpp Account.cpp -o Bank