首页 > 解决方案 > AIX 中 gcc 编译器中的异常处理

问题描述

我正在使用 AIX 7.1 和 gcc 8.3 编译器。我看到如果我使用 -Wl,-G 标志构建,抛出的异常不会被捕获。在下面的代码中,如果我不使用 -Wl,-G 标志,我会看到“catch int”。使用此标志,程序核心。

void foo()
{
 try {
   throw 1;
 } catch(int&) {
   std::cout << “catch int” << std::endl;
 }
}

int main()
{
 foo();
}

我的猜测是默认情况下异常处理是禁用的,需要通过一些编译器标志来启用。其他人有这方面的经验吗?请注意,这是特定于 AIX 平台的。

这就是我正在建造的方式。整个代码在 1 个文件中。

裸08$ g++ -Wl,-G 1.cc

裸 08$ ./a.out

在抛出“int”IOT/Abort 陷阱的实例后调用终止(核心转储)

裸08$ g++ -Wl,-G -lsupc++ 1.cc

裸 08$ ./a.out

在抛出一个'int'实例后调用终止递归地调用IOT / Abort陷阱(核心转储)

如果没有 -G 选项,我会得到如下所示的链接错误(不是在上面的玩具程序中,而是在我的真实代码中)。

ld: 0711-317 错误: 未定义符号: .std::basic_istream >::seekg(long long, std::_Ios_Seekdir) ld: 0711-317 错误: 未定义符号: .sqrtf ld: 0711-317 错误: 未定义符号: std::basic_streambuf >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode)

有人见过这个吗?我在一块岩石和一个艰难的地方。使用 -G 选项摆脱上述链接错误,但使用该选项,C++ 异常处理不起作用。

标签: aix

解决方案


不要使用选项-G。如果您希望使用某些特定于 AIX 的选项,请使用-brtl

g++ -Wl,-brtl -o AmarnathShanbhag AmarnathShanbhag.cc && ./AmarnathShanbhag
catch int

推荐阅读