【发布时间】:2015-11-03 13:26:28
【问题描述】:
我试图了解如何克服 GCC 5 中引入的双重 ABI 的问题。但是,我无法做到。这是一个重现错误的非常简单的示例。我使用的 GCC 版本是 5.2。如您所见,我的 main 函数(在 main.cpp 文件中)非常简单:
// main.cpp
#include <iostream>
#include <string>
int main()
{
std::string message = "SUCCESS!";
std::cout << message << std::endl;
}
当我输入时
/home/aleph/gcc/5.2.0/bin/g++ main.cpp
我收到以下错误消息:
/tmp/ccjsTADd.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
main.cpp:(.text+0x43): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
main.cpp:(.text+0x5c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
main.cpp:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: erreur: ld a retourné 1 code d'état d'exécution
如果我将_GLIBCXX_USE_CXX11_ABI 的值更改为0,问题就消失了。
但是,如何使用默认 ABI 进行操作?
编辑:更简单的问题(删除 cmake 脚本)
【问题讨论】:
-
在 gcc 5.x 和 gcc 4.x 两种情况下,
make VERBOSE=1是什么意思?实际上在这两种情况下使用不同的 gcc 吗?由于 cmake 缓存 CXX_COMPILER 值和在运行脚本(Cmakelists.txt)的时候你不能改变编译器 -
"如果您收到有关未定义引用符号的链接器错误,这些符号涉及 std::__cxx11 命名空间或标签 [abi:cxx11] 中的类型,则可能表明您正在尝试将目标文件链接在一起使用 _GLIBCXX_USE_CXX11_ABI 宏的不同值编译的“gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
-
我删除了构建存储库中的所有内容以避免任何缓存问题
-
是的,可能存在兼容性问题,但我不知道如何检测,如何解决。
-
如果我将 _GLIBCXX_USE_CXX11_ABI 宏的值更改为 0,以便使用旧的 ABI,我可以工作。但是,当 _GLIBCXX_USE_CXX11_ABI 设置为 1 时,我不知道如何使事情正常运行。我在 GCC 的目录中找不到任何链接器。