【发布时间】:2018-03-22 08:26:28
【问题描述】:
我在 GCC 中为 C++11 引入的新 ABI 遇到了问题。升级到 GCC 5.3 后,我的项目不再编译。我得到的错误信息很简单:
undefined reference to `tokenize(std::__cxx11::basic_string' ...more characters
或
undefined reference to `extract(std::string const&)'
所以,看起来我搞砸了,GCC 无法决定我想要旧 ABI 还是新 ABI(__cxx11:: 部分在一些错误消息中丢失,而在其他消息中出现)?
我尝试了几种解决方案来解决这个问题:
- 将
-D_GLIBCXX_USE_CXX11_ABI=0传递给 GCC, - 将
-D_GLIBCXX_USE_CXX11_ABI=1传递给 GCC, - 直接在源代码中设置宏,
- 在传递
-Wabi-tag标志时,在 GCC 抱怨的声明中设置abi_tag属性,
不幸的是,它们都不起作用(即允许代码编译)。我知道的一件事是,只有返回 std::string 或将其作为参数的函数才能链接。鉴于我在互联网上读到的有关该问题的信息,这是可以预料的。我无法在一个简单的示例程序中重现该问题,以便在此处展示。
我的问题有什么明显的解决方案吗?
【问题讨论】:
-
这是一个链接器错误,而不是编译器错误。这表明您尝试链接的编译对象和库是使用不同的 ABI 编译的。
-
@rici 是的,你是对的。我知道问题发生在链接期间。但是,是编译器发出要链接的代码(或者我的理解不足?)。我不知道的是为什么 G++ 有时使用新的,有时使用旧的 ABI 发出代码,即使我正在对代码进行完全重新编译。