AIX 1.7上的C ++编译问题

时间:2011-12-26 05:21:07

标签: c++ aix

编译一个抛出异常的简单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

请你帮忙解决这个问题......

1 个答案:

答案 0 :(得分:0)

我认为你在问题中提供了答案。这个问题帮助我解决了类似的问题。我们有一个特定的C二进制文件,它被链接到用g ++编译并能够抛出异常的共享对象。异常总是在库中捕获。要在AIX上链接它,您必须在链接行上指定所有依赖库。所以我添加了-lstdc ++。这允许编译所有内容,但是一旦在共享对象中抛出异常,运行时测试就会崩溃。添加-lgcc_s修复此问题是因为gcc_s是所有异常处理代码所在的位置。

正如Steve C评论的那样,另一种方法是用g ++编译.c文件,然后处理所有这些。我们的构建系统总是调用gcc for .c文件,这对我来说很难改变所以我只是添加了-lstdc ++和-lgcc_s,一切都运行,包括所有的运行时测试。