Когда я использую 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 динамически связан.