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

时间:2009-11-16 07:38:45

标签: c++ gcc dynamic exception-handling

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

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

在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是动态链接的。

2 个答案:

答案 0 :(得分:8)

您需要指定RTLD_GLOBAL标志以进行dlopen。这将允许正确的弱符号绑定,因此异常对象的每个typeinfo符号将指向同一位置,这是异常处理ABI代码所需的。

答案 1 :(得分:2)

这取决于您使用的GCC版本。
首先,确保使用“-fPIC”编译所有内容并链接“-rdynamic”标志。
仍然需要RTLD_NOW标志。