当我使用 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/