Как отловить исключение, выброшенное из библиотеки в GCC C ++? - PullRequest
3 голосов
/ 16 ноября 2009

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

Ответы [ 2 ]

8 голосов
/ 16 ноября 2009

Вам необходимо указать флаг RTLD_GLOBAL для dlopen. Это позволит корректно связывать слабые символы, поэтому каждый символ typeinfo для объекта исключения будет указывать на одно и то же место, что необходимо для обработки исключения кодом ABI.

2 голосов
/ 16 ноября 2009

Это зависит от версии GCC, которую вы используете.
Прежде всего, убедитесь, что вы все компилируете с помощью «-fPIC» и связываете с флагом «-rdynamic».
Флаг RTLD_NOW по-прежнему необходим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...