c++ - 如何捕获从 GCC C++ 中的库抛出的异常?

标签 c++ gcc dynamic exception-handling

当我使用 dlopen 动态加载一个库时,我似乎无法捕获该库抛出的异常。据我了解,这是因为 dlopen 是一个 C 函数。

是否有另一种动态加载库的方法,可以捕获 GCC 中库抛出的异常?

在 Windows 中,您可以使用 LoadLibrary,但对于 Linux,我只找到了 dlopen,但在使用 dlopen 时,我无法捕获异常。

编辑: 我试过 void* handle = dlopen("myLib.so", RTLD_NOW | RTLD_GLOBAL);而且我仍然无法捕获 myLib.so 抛出的异常

编辑 2: 我用自己的命名空间抛出自定义异常。我希望能够在库外捕获这些异常。 我希望能够在不同的编译器上进行编译,例如 GCC 3.2 和 GCC 4.1。

在 myLib2.so 中我抛出异常,一个例子:

namespace MyNamespace {  
    void MyClass::function1() throw(Exception1) {  
        throw Exception1("Error message");  
    } 
}

在 myLib1.so 中我想捕获那个异常:

std::auto_ptr <MyNamespace::MyClass> obj = MyNamespace::getClass();
try {  
    obj->function1();  
} catch (MyNamespace::Exception1& e) {  
    std::cout << e.what();  //This is not caught for some reason.  
}

mylib1.so 动态加载 myLib2.so:

void* handle = dlopen("myLib2.so", RTLDNOW | RTLDGLOBAL);

在 Windows 中工作(以捕获我的异常)但我当然不使用 dlopen。

编辑 3:myLib1.so 是动态链接的。

最佳答案

您需要为 dlopen 指定 RTLD_GLOBAL 标志。这将允许正确的弱符号绑定(bind),因此异常对象的每个类型信息符号将指向同一个位置,这是异常处理 ABI 代码所需要的。

关于c++ - 如何捕获从 GCC C++ 中的库抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740661/

相关文章:

c++ - 具有多个条件 IF 语句的奇怪行为

c++ - 简单的程序崩溃

animation - ffmpeg 动态缩小视频(向后挤压)或缩小到小于原始视频

javascript - 在 Chrome 中从动态表单发布到动态 iframe 会打开一个新窗口

c++ - fprintf 和 WriteConsole 的输出以相反的顺序发生

c++ - 如何使第三方库线程安全以用于 Boost 线程?

java - JNI HellowWorld unsatisfiedlinkError 找不到依赖库

linux - 安装 g++ 而不更新 glibc

javascript - 如何在 SVG 中获取有效的动态 javascript 引用

c++ - 从 while 循环中断后似乎没有进一步的代码执行 (c++)