在编译引发异常的简单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;
}


当我如下编译时:

执行以下命令:
步骤2.1 => gcc -maix64 -fpic -c calc.cc
步骤2.2 => gcc -maix64 -shared -o libcalc.so calc.o -lstdc ++
步骤2.3 => gcc -maix64 main.cc libcalc.so -lstdc ++


并运行该程序,程序崩溃并显示以下错误:

抛出“ char const *”实例后终止调用
物联网/中止陷阱(堆芯弃置)


但是代替步骤2.3,如果我们使用以下命令,一切将按预期进行:

gcc -maix64 main.cc libcalc.so -lstdc ++ -lgcc_s

您能帮忙解决这个问题吗?

最佳答案

我想,您提供了问题的答案。这个问题帮助我解决了类似的问题。我们有一个特定的C二进制文件,该二进制文件已链接到使用g ++编译的共享对象,并且能够引发异常。异常总是在库中捕获。为了在AIX上进行链接,您必须在链接行上指定所有从属库。因此,我添加了-lstdc ++。这样就可以编译所有内容,但是只要在共享库中引发异常,运行时测试就会崩溃。添加-lgcc_s可以解决此问题,因为gcc_s是所有异常处理代码所在的位置。

正如Steve C所评论的那样,替代方法是只使用g ++编译.c文件,然后处理所有这些。我们的构建系统始终为.c文件调用gcc,这对我来说很痛苦,因此我只添加了-lstdc ++和-lgcc_s,一切正常,包括所有运行时测试。

关于c++ - AIX 1.7上的C++编译问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8633127/

10-13 08:19
查看更多