2011-12-26 72 views
1

我在编译引发异常的简单C++程序时遇到了这个奇怪的问题。AIX 1.7上的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

可否请你在解决这个帮助...

+2

你能检查你的文章吗?你的calc和main是一样的。 – 2011-12-26 05:25:05

+1

你的意思是AIX 7.1吗? AIX 1.7如果存在的话,已经过时了几十年。 – 2011-12-26 05:55:49

+0

它是1.7(对于错字抱歉)' – 2011-12-26 05:58:08

回答

0

您的问题提供了答案, 我认为。这个问题帮助我解决了一个类似的问题。我们有一个特定的C二进制文件,它被链接到用g ++编译的共享对象,并且能够抛出异常。例外情况总是在图书馆中发现。为了在AIX上将其链接起来,您必须在链接行上指定所有依赖库。所以我添加了-lstdC++。这样可以编译所有内容,但只要在共享对象中引发异常,运行时测试就会崩溃。添加-lgcc_s解决了这个问题,因为gcc_s是所有异常处理代码所在的地方。

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