某些标准库类与clang ++的链接器错误

时间:2015-07-14 04:23:38

标签: c++ clang++ libstdc++

我面临一个奇怪的链接器问题clang ++ - 它能够找到std :: string类的定义但不能找到std :: ios_base :: failure class的定义。

$ cat foo.cpp
#include <string>
#include <iostream>

int main()
{
   std::string msg = "hello world";
   std::ios_base::failure f(msg);
   std::cout << msg << std::endl;
   return 0;
}

$ clang++ foo.cpp
/tmp/foo-b77625.o: In function `main':
foo.cpp:(.text+0x4d): undefined reference to `std::ios_base::failure::failure(std::__cxx11::basic_string<char,  std::char_traits<char>, std::allocator<char> > const&)'
clang-3.7: error: linker command failed with exit code 1 (use -v to see  invocation)

$ clang++ --version
clang version 3.7.0 (trunk 239466)
Target: x86_64-unknown-linux-gnu
Thread model: posix

我注意到如果我评论std :: ios_base :: failure的实例化,程序会正确链接(并执行)。

$ clang++ foo.cpp && ./a.out
hello world

有人可以帮我理解这种行为以及如何解决这个问题吗?

P.S。我也观察到clang版本3.6.0的相同行为。

2 个答案:

答案 0 :(得分:0)

假设你打算使用clang自己的标准库(libc ++),那么你就不远了 - 你将不得不提供标准库的include-path(你的libcxx-build)安装到):

$> clang++ foo.cpp -stdlib=libc++ -I/path/to/libcxx-build/include/c++/v1

(添加&#34; -v&#34;切换到上面,如果你想要详细的输出)。

P.S。除非包括去其他地方为你的clang-3.7,上面的工作 - 用我的clang-3.8测试

答案 1 :(得分:-1)

尝试在你的fie开头添加include

#include <ios>

根据cpprefrence,它在标题<ios>

中定义