【发布时间】:2018-08-03 13:05:13
【问题描述】:
我一直在尝试不同的 c++ 库,并发现以下内容: 简单的应用:
#include <iostream>
int main(int argc, char* argv[])
{
try
{
throw 1;
}
catch(...)
{
std::cout << "Exception is caught\n";
}
}
当我像这样在 ARM 上编译它时:
clang++ -stdlib=stdlibc++
异常被按预期捕获。
但是当我把它改成:
clang++ -stdlib=libc++
我不断得到:
terminating with uncaught exception of type int
Aborted
我尝试使用各种标志显式打开异常,例如:
-fexceptions
-fcxx-exceptions
-frtti
但是这些标志都不起作用。未捕获异常的原因是什么? 会不会是因为安装不正确的libc++?
附:
在 PC 上,使用 libc++ 编译的同一程序按预期工作。
两个平台上的 libc++ 版本相同 - 3.7.0-1ubuntu0.1
【问题讨论】:
-
如果是由于错误的 libc++ 安装造成的,您应该会遇到某种形式的链接器或加载器错误。我打赌 libc++ 只支持包罗万象的标准异常。
-
那么为什么它可以在 PC 上运行?除了通常的 std::exception 也没有被捕获。
-
也许 clang 会生成异常管理代码,假设它将与错误的展开库链接!?!??在两个生成的可执行文件上尝试 ldd。通常它与提供 _Unwind_x 符号的 GCC 版本的 libgcc_s 链接。也许还检查
nm a.out | grep _Unwind。可能会出现有关预期符号版本的信息,例如 x86 上的“@@@GCC_3.0”。但我想知道链接阶段是如何成功的。
标签: c++ exception arm clang++ libc++