【问题标题】:C++ Compilation Issue on AIX 1.7AIX 1.7 上的 C++ 编译问题
【发布时间】:2012-01-27 19:42:36
【问题描述】:

我在编译一个引发异常的简单 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*' 的实例后调用终止 IOT/Abort 陷阱(核心转储)

但不是 Step 2.3 ,如果我们使用以下命令,事情会按预期工作:

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

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

【问题讨论】:

  • 你能检查你的帖子吗?你的 calc 和 main 是一样的。
  • 您是指 AIX 7.1 吗? AIX 1.7(如果曾经存在的话)已经过时了几十年。
  • 它是 1.7(抱歉打错了)``
  • 当您尝试使用 C++ 编译器而不是 C 编译器时会发生什么?

标签: c++ aix


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2010-12-11
    • 2013-03-23
    • 2013-09-29
    • 2011-04-04
    • 2015-01-10
    • 1970-01-01
    • 2016-02-17
    • 2010-10-08
    相关资源
    最近更新 更多