【问题标题】:Mac OSX libc++ is missing std::uncaught_exceptions symbolMac OSX libc++ 缺少 std::uncaught_exceptions 符号
【发布时间】:2016-08-09 13:22:43
【问题描述】:

我注意到我的 Mac 上的库存 libc++ 中缺少 std::uncaught_exceptions 符号:

$ clang++ -v; otool -L /usr/lib/libc++.dylib
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
/usr/lib/libc++.dylib:
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
    /usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 125.0.0)
...
$ nm /usr/lib/libc++.dylib | c++filt | grep uncaught
0000000000007782 T std::uncaught_exception()
                 U ___cxa_uncaught_exception

但是,头部声明了原型:

$ pwd
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
$ grep uncaught_exceptions exception
int  uncaught_exceptions() noexcept;  // C++17
_LIBCPP_FUNC_VIS int uncaught_exceptions() _NOEXCEPT;

这是一个糟糕的构建还是什么?从 libc++ 源代码中,我看到该符号应该以 libc++ 结尾,但它不存在,并且在链接时我得到一个丢失的符号。

编辑:这是一个最小的失败程序:

$ cat t.cpp; clang++ -std=c++1z t.cpp
#include <exception>

int main () {
    return std::uncaught_exceptions ();
}
Undefined symbols for architecture x86_64:
  "std::uncaught_exceptions()", referenced from:
      _main in t-a4015f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

【问题讨论】:

  • 问题是你真的用C++17编译吗?在C++11 中,它仍然是布尔值std::uncaught_exception(),所以请尝试使用它。
  • 编译是用-std=c++1z完成的。问题不在于编译阶段,其中 std::uncaught_exceptions 的原型在异常头中可见,而是在链接时,当库中缺少符号时。
  • 也许可以展示你在代码中是如何使用它的;我确实怀疑它可能是一个错误。如果您将 llvm 主干的异常标头与 OS X 版本进行比较,则没有 #ifndef _LIBCPP_NO_EXCEPTIONS 声明以及 uncaught_exception_count()... 目前尚不清楚这是否与它有关。我可以使用c++1zuncaught_exceptions 编译代码,但当我尝试调用该方法时,我会遇到与您相同的错误。
  • 我添加了一个显示失败的最小程序。

标签: c++ macos libc++ darwin


【解决方案1】:

自从 Apple 认为更新 libc++.dylib 足够重要以来已经有一段时间了(几年)。我听说它可能会在操作系统中更新 El Capitan之后。

Swift 怎么了?! ;-)

【讨论】:

  • 我不知道。那我就把它当成缺陷吧。
  • 还没有更新。 dyld: Symbol not found: __ZdlPvSt11align_val_t Referenced from: /usr/local/Cellar/verilator/3.912/bin/verilator_bin Expected in: /usr/lib/libc++.1.dylib
  • @Barry 我刚刚检查了 OP 在 Sierra 10.12.6 上的最小失败程序,它通过了。你在什么操作系统上测试?我将使用最新信息更新此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多