【问题标题】:Where is std::endl in my compiled standard library?我编译的标准库中的 std::endl 在哪里?
【发布时间】:2017-01-19 17:03:39
【问题描述】:

我试图从我的 C++ 标准库中通过它们的名称来查找函数。我在 macOS 上,所以使用nm 命令我可以检查dylib

nm -g /usr/local/lib/libc++.dylib
nm -g /usr/local/lib/libc++abi.dylib

在输出中,我可以找到std::cout 的错误名称:

0000000000079ec0 S __ZNSt3__14coutE
0000000000079f60 S __ZNSt3__15wcoutE
etc... 

但是,我没有找到std::endl 的任何条目。

有趣的是,我的 LLVM IR 解释器也找不到 std::endl,尽管 std::cout 工作正常:

LLVM ERROR: Program used external function     
'__ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_' which could not be resolved!

我应该在我的系统上哪里找到std::endl

【问题讨论】:

  • 你能找到std::flush吗?
  • 我怀疑 std::endl 没有链接,因为它只是 << '\n' << std::flush
  • 它可能是一个只有标题的函数。
  • 如果你使用 C++ 编译器前端,如 g++clang++ 来构建你的程序,或者使用像 XCode 这样的 IDE,那么你不需要显式链接任何库来访问标准库。那么你能告诉我们实际问题是什么吗? 为什么你想知道std::endl在哪里?
  • 它可能是一个模板,所以它需要在源代码中可用,并且不能编译到库中(除非特别指示包含实例化)。

标签: c++ llvm libc++


【解决方案1】:

正如 YSC 提到的,std::endl 是一个函数(可能是内联的),它所做的只是输出结束行 \n 字符然后调用 flush

http://en.cppreference.com/w/cpp/io/manip/endl

看起来 libcxx 已隐藏 endl:https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L999

虽然flush没有这样的属性:https://github.com/llvm-mirror/libcxx/blob/master/include/ostream#L938

【讨论】:

  • 嗯... clearly 是一个模板,所以这就是为什么它没有被编译到 C++ 标准库中的原因。它是否被内联完全是另一回事。
  • 所以? OP 从未表示,std::flush 也将从他们的 C++ 标准库中导出。我不明白你要表达的意思。
  • 我的,糟糕。误解了这个问题。可能是由于应用于函数的可见性属性(如果有)?
  • 此答案包含解决方案:它不是已编译库的一部分,因为它是标头中的函数。也是inline,给lli带来了麻烦。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2011-07-24
相关资源
最近更新 更多