2015-10-28 316 views
42

我使用C++ 11,但也有一些没有为它配置的库,并且需要一些类型转换。特别是我需要一种方法来将std::__cxx11::string转换为常规std::string,但是使用谷歌搜索我找不到方法来执行此操作,并将(string)放在前面不起作用。将std :: __ cxx11 :: string转换为std :: string

如果我不转换,我得到的链接错误是这样的:您正在使用GCC 5

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

错误听起来更像编译器无法找到'insertMember()'方法。 –

+1

嗯,它可以找到它与我没有使用'C++ 11' – jorgen

+0

其他程序其实它似乎是链接器,而不是编译器。 “发现”是什么意思,那些“其他程序”是什么? –

回答

57

这可能吗?

如果你得到关于未定义的引用链接错误,对涉及在STD类型的符号:: __ cxx11命名空间或标签[ABI:cxx11]那么它很可能表明你正在尝试链接在一起对象进行编译的文件对_GLIBCXX_USE_CXX11_ABI宏使用不同的值。链接到使用旧版GCC编译的第三方库时,通常会发生这种情况。如果第三方库不能用新的ABI重建,那么你将需要用旧的ABI重新编译你的代码。

来源:GCC 5 Release Notes/Dual ABI

定义下面的宏以前包括任何标准库头应该解决您的问题:#define _GLIBCXX_USE_CXX11_ABI 0

+1

我试过了;现在,我在使用C++ 11函数的任何地方都会遇到链接器错误。也许没有办法使用C++ 11和编译后的hdf5库来实现这个功能。 – jorgen

+0

对于我来说,在Ubuntu 14.04上,默认情况下,g ++ 6.2编译时将该值设置为0,而在16.04版中,g ++版本编译时将其设置为1.在14.04,将其设置为1实际上并没有做任何事情;生成的目标文件不使用CXX11 ABI。我怀疑这是一个系统限制。 –

+0

我不确定为什么编译器会抛出'undefined reference',并且在寻找解决方案之前,我在程序中检查了我的整个链接并且没有找到任何东西。之后,我决定在网上搜索,发现这一点。它的作品像魅力,谢谢:) – Shravan40

29

如果你可以重新编译您使用的所有不兼容库,用编译器选项的做法,

-D_GLIBCXX_USE_CXX11_ABI = 1

然后重建你的项目。如果你不能做到这一点,添加到您的项目的生成文件编译器选项

-D_GLIBCXX_USE_CXX11_ABI = 0

的定义

的#define _GLIBCXX_USE_CXX11_ABI 0/1

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

+1

编译器标志为我工作。谢谢。我在gcc的这个愚蠢的改变浪费了4天! –

+0

谢谢。这个标志也适用于我 – hbobenicio

0

我得到了这个,我发现解决这个问题的唯一方法是更新所有的mingw-64(我在msys2上使用pacman为你提供了信息)。