когда вы запустите приложение, чтобы исправить вашу проблему. Вам не нужно ничего перекомпилировать:

я возникли проблемы с неправильным функционированием исключений (или, по крайней мере, как я надеюсь, я знаю, что есть проблемы с этим) в совместно используемых библиотеках при загрузке с использованиемdlopen, Я включил здесь несколько упрощенных примеров кода. Фактическая ситуацияMyApp= Matlab,myext1= расширение mexglx matlab,MyLib это общая библиотека моего кода между двумя расширениями (myext1, myext2)

mylib.h

struct Foo { Foo(int a); m_a; }
void throwFoo();

mylib.cpp

#include "mylib.h"
Foo::Foo(int a): m_a(a) {}
void throwFoo() { throw Foo(123); }

myext1.cpp

#include "mylib.h" 
#include <iostream>
extern "C" void entrypoint()    
{ 
   try { throwFoo(); } 
   catch (Foo &e) { std::cout << "Caught foo\n"; }
}

myext2.cpp Идентичен myext1.cpp

myapp.cpp

#include <dlfcn.h>
int main()
{
  void *fh1 = dlopen("./myext1.so",RTLD_LAZY);
  void *fh2 = dlopen("./myext2.so",RTLD_LAZY);
  void *f1  = dlsym(fh1,"entrypoint");
  void *f2  = dlsym(fh2,"entrypoint");
  ((void (*)())func1)();  // call myext1 (A)
  ((void (*)())func2)();  // call myext2 (B)
}

Компилирование этого кода:

g++ mylib.cpp -fPIC  -o libmylib.so -shared
g++ myext1.cpp -fPIC -o myext1.so -shared -L. -lmylib -Wl,-rpath=.
g++ myext2.cpp -fPIC -o myext2.so -shared -L. -lmylib -Wl,-rpath=. 
g++ myapp.cpp -fPIC -o myapp -ldl

Призыв квходная точка() вA работает как положено, сthrowFoo () бросая исключение ивходная точка() ловить это. Вызов вB Однако не удается поймать исключение. Добавление более диагностического кода показывает, что typeinfo дляFoo класс отличается двумя расширениями. Изменение порядка двухdlopen вызовы не имеют значения, второе загруженное расширение не удается.

Я знаю, что могу это исправить, используяRTLD_GLOBAL в качестве дополнительного флага дляdlopen, но приложение (Matlab), использующее dlopen, находится вне моего контроля. Есть ли что-нибудь, что я могу сделать сMyLib или жеmyext1, myext2 исправить эту проблему?

Я должен избегать использования флагов LD для времени выполнения (так как я не могу контролировать пользователей, использующих двоичный файл Matlab). Любые другие предложения?

Ответы на вопрос(3)

Ваш ответ на вопрос