2013-03-20 3 views
2

У меня есть файл с функцией void initGui(). Это делает вещи. У меня также есть общая библиотека .so, созданная с этим файлом.Странные символы при связывании общей библиотеки g ++

Проблема в том, что когда я пытаюсь запустить dlsym(..., "initGui"), dlerror() говорит мне, что он не нашел символ (конечно, я использовал dlopen, чтобы открыть его). Поэтому я попробовал nm свою общую библиотеку. Я «понял», что _Z7initGuiiii может быть тем, что я ищу. Поэтому я попробовал dlsym это ... И это сработало.

Возможно, кто-нибудь скажет мне, как иметь чистые символы в моей общей библиотеке объектов?

Скомпилировать с помощью g++ -Wall -Wextra -Werror -c -fPIC.

+0

Это когниция имени C++. Однако я не знаю ответа на ваш вопрос. Это хороший вопрос. – nalply

+1

Возможно, это поможет вам: http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html – nalply

ответ

3

Обычная практика, когда dlsym -ную внутри некоторых dlopen -ED разделяемой библиотеке, закодированной в C++, чтобы иметь соглашение, что эти добившиеся символы (те, которые вы dlsym-ки) объявляются extern "C". Тогда их имя легко видно с помощью dlsym. Таким образом, вы должны объявить

extern "C" void initGui(void); 

, а затем сделать

typedef void initguiroutine_sig_t(void); 
initguiroutine_sig_t* initguiptr = dlsym(dlhandle,"initGui"); 
if (!initguiptr) { 
    fprintf(stderr, "initGui not found: %s\n", dlerror()); 
    exit (EXIT_FAILURE); 
}; 
// later, call initguiptr like 
(*initguiptr)(); 

Я не рекомендую понимание в больших деталях, как ваш C++ name mangling works, это не очень хорошо определены, и детали зависят от конкретной версии библиотеки C++ (в частности, стандартную библиотеку C++) и версию компилятора.

+0

Спасибо всем за ваши ответы! –

Смежные вопросы