【发布时间】:2019-08-25 11:07:59
【问题描述】:
我正在使用 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 个文件中。
bare-08$ g++ -Wl,-G 1.cc
bare-08$ ./a.out
在抛出 'int' 的实例后调用终止 IOT/Abort 陷阱(核心转储)
bare-08$ g++ -Wl,-G -lsupc++ 1.cc
bare-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++ 异常处理不起作用。
【问题讨论】:
-
尝试将
-lsupc++添加到链接中。 -
添加 supc++ 是我尝试的第一件事,但没有帮助。我确实在 __cxa_throw 中放置了一个断点,并且通过它似乎我们进入了展开错误,这导致它调用 std::terminate。
-
请编辑您的原始帖子,并描述您是如何链接共享对象和主可执行文件的。我认为你应该在这两种情况下都使用 -lsupc++。
-
创建可执行文件时,为什么要使用选项
-G?它应该在创建共享对象时使用。
标签: aix