我使用的是c ++ 11,还有一些没有为它配置的库,需要一些类型转换。特别是我需要一种方法将std::__cxx11::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'
答案 0 :(得分:83)
你有可能使用GCC 5吗?
如果您收到有关涉及std :: __ cxx11命名空间中的类型或标签[abi:cxx11]的符号的未定义引用的链接器错误,那么它可能表示您正在尝试将使用不同值编译的目标文件链接在一起对于_GLIBCXX_USE_CXX11_ABI宏。当链接到使用旧版GCC编译的第三方库时,通常会发生这种情况。如果无法使用新的ABI重建第三方库,则需要使用旧的ABI重新编译代码。
来源:GCC 5 Release Notes/Dual ABI
在之前定义以下宏(包括任何标准库标题)应解决您的问题:#define _GLIBCXX_USE_CXX11_ABI 0
答案 1 :(得分:46)
如果您可以重新编译您使用的所有不兼容的库,请使用编译器选项
-D_GLIBCXX_USE_CXX11_ABI = 1
然后重建您的项目。如果您不能这样做,请添加到项目的makefile编译器选项
-D_GLIBCXX_USE_CXX11_ABI = 0
定义
#define _GLIBCXX_USE_CXX11_ABI 0/1
也很好但你可能需要将它添加到你的所有文件中,而编译器选项可以同时为所有文件添加它。
答案 2 :(得分:2)
发生类似问题时,是因为我的库是使用clang++
构建的,并且默认情况下它已链接到libstdc++.so
。应用二进制文件是使用clang
构建的,并与-lc++
选项链接。
检查依赖项的最简单方法是执行ldd libName.so
要修复此问题,您应该在应用程序和库中使用相同的库。
最简单的方法。使用clang++
构建库,并使用clang++
编译应用。两个步骤都没有额外的链接选项。将使用默认的stdlib。
使用-stdlib=c++
构建库,并使用-lc++
编译应用。在这种情况下,库和应用程序都将使用libc++.so
。
不带任何附加选项的构建库,并将二进制文件链接到-lstdc++
。在这种情况下,库和应用程序都将使用libstdc++.so
。
答案 3 :(得分:0)
我得到了这个,我发现解决这个问题的唯一方法就是更新所有的mingw-64(我在msys2上使用pacman来做你的信息)。
答案 4 :(得分:0)
对我来说-D_GLIBCXX_USE_CXX11_ABI = 0没有帮助。
在我链接到C ++ libs版本而不是gnustl之后,它可以工作。
答案 5 :(得分:0)
这里的答案主要集中在解决它的简短方法上,但是如果这样做没有帮助,我将给出一些检查步骤,这对我有帮助(仅限Linux):
列出库中的符号,并grep链接程序抱怨的符号(在命令行中输入命令):
nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout
如果获得方法签名,则继续执行下一步,如果得到no symbols
,则很可能是从库中剥离了所有符号,这就是为什么链接器在以下情况下找不到它们的原因链接库。重建库时不剥离所有符号,如果需要,可以剥离调试(strip -S
选项)符号。
使用c ++分解器来理解方法签名,例如this one
答案 6 :(得分:0)
最近在尝试与Ubuntu 16.04上的 hdf5版本1.10.5 的预构建二进制文件链接时遇到了类似的问题。此处建议的解决方案均不适合我,我使用的是g ++版本9.1。我发现最好的解决方案是从源代码构建hdf5库。不要使用预编译的二进制文件,因为它们是使用gcc 4.9编译的!相反,可以从hdf website下载适用于您的特定发行版的源代码归档文件并构建该库。非常简单。
答案 7 :(得分:0)
就我而言,我遇到了类似的问题:
/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
经过一些研究,我意识到问题是通过Visual Studio Code编译Bank.cpp文件的方式生成的。因此,为了解决这个问题,我只是提示了follow命令,以成功编译c ++文件:
g++ Bank.cpp Account.cpp -o Bank
使用上面的命令,它可以正确链接标题,实现和Main c ++文件。
OBS:我的g ++版本:Ubuntu 20.04上的9.3.0