が不足している私がのstd :: uncaught_exceptionsシンボルが私のMac上の在庫のlibC++から欠落していることに気づいた:マックOSXの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++になるはずですが、そこにはないので、リンクするときにシンボルが欠落してしまいます。
編集:Appleはそれが十分に重要なのlibC++ dylibを更新するために考えられているのでそれはしばらく(数年)となっている
$ 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'ではまだbool' std :: uncaught_exception() 'なので、代わりにそれを使ってみてください。 –
'-std = C++ 1z'でコンパイルしました。この問題は、std :: uncaught_exceptionsのプロトタイプが例外ヘッダーに表示されるコンパイル段階ではなく、シンボルがライブラリから欠落しているリンク時に発生します。 – Engineerist
コード内でどのように使用しているかを表示することがあります。私はバグかもしれないが、疑いがある。 llvmトランクからの例外ヘッダをOS Xバージョンと比較すると、 '#ifndef _LIBCPP_NO_EXCEPTIONS'宣言と' uncaught_exception_count() '宣言はありません。これと関係があるかどうかは不明です。私は 'C++ 1z'と' uncaught_exceptions'でコードをコンパイルすることができますが、メソッドを呼び出すと同じエラーが出ます。 –