编译一个抛出异常的简单C ++程序时,我遇到了这个奇怪的问题。
main.cc:
#include <stdio.h>
double mean(double a, double b)
{
if((a + b) == 0)
{
throw "Exception:: Numerator is Zero";
}
return (a+b) / 2;`
}
calc.cc:
#include <stdio.h>
double mean(double a, double b)
{
if((a + b) == 0)
{
throw "Exception:: Numerator is Zero";
}
return (a+b) / 2;
}
当我按如下方式编译时:
Execute the following commands : Step 2.1 => gcc -maix64 -fpic -c calc.cc Step 2.2 => gcc -maix64 -shared -o libcalc.so calc.o -lstdc++ Step 2.3 => gcc -maix64 main.cc libcalc.so -lstdc++
运行程序,程序崩溃时出现以下错误:
terminate called after throwing an instance of 'char const*' IOT/Abort trap (core dumped)
但是代替步骤2.3,如果我们使用以下命令,事情就会按预期工作:
gcc -maix64 main.cc libcalc.so -lstdc++ -lgcc_s
请你帮忙解决这个问题......
答案 0 :(得分:0)
我认为你在问题中提供了答案。这个问题帮助我解决了类似的问题。我们有一个特定的C二进制文件,它被链接到用g ++编译并能够抛出异常的共享对象。异常总是在库中捕获。要在AIX上链接它,您必须在链接行上指定所有依赖库。所以我添加了-lstdc ++。这允许编译所有内容,但是一旦在共享对象中抛出异常,运行时测试就会崩溃。添加-lgcc_s修复此问题是因为gcc_s是所有异常处理代码所在的位置。
正如Steve C评论的那样,另一种方法是用g ++编译.c文件,然后处理所有这些。我们的构建系统总是调用gcc for .c文件,这对我来说很难改变所以我只是添加了-lstdc ++和-lgcc_s,一切都运行,包括所有的运行时测试。