выпуск dlopen (OSX) - PullRequest
       8

выпуск dlopen (OSX)

5 голосов
/ 15 ноября 2011

У меня есть основное приложение, которое динамически загружает dylib, изнутри которого dylib Я хотел бы вызывать экспортированные функции из моей основной программы.Я использую dlopen(NULL,flag) для получения моих основных приложений handle и dlsym(handle, symbol) для получения function.

dlopen дает no error, но когда я пытаюсьdlsym my function Я получаю следующее error:

dlerror dlsym(RTLD_NEXT, CallMe): symbol not found

Символ экспортируется исправлено, подтверждено нм Я не уверен, почему RTLD_NEXT существует?это результат dlopen(NULL,flag)?

Как я могу решить эту проблему или достичь своей цели?

Или есть другие способы вызова основного приложения (желательно не передавая указатели на функциик дилибу)?

Заранее спасибо!

Добавлено:

Экспорт:

extern "C" {
    void CallMe(char* test);    
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
    NSLog(@"CallMe with: %s",test);
}

Результат нм

...
0000000000001922 T _CallMe
..

Код в dylib:

void * m_Handle;
typedef void CallMe(char* test);
CallMe* m_Function;

m_Handle = dlopen(NULL,RTLD_LAZY); //Also tried RTLD_NOW|RTLD_GLOBAL

if(!m_Handle)
    return EC_ERROR;

m_Function = (CallMe*)dlsym(m_Handle, "CallMe");
if(!m_Function)
    return EC_ERROR;

m_Function("Hallo");

1 Ответ

5 голосов
/ 15 ноября 2011

Я думаю, что лучшим подходом может быть создание проприетарного протокола с вашей динамической библиотекой, где вы инициализируете его, передавая ему структуру указателей функций. Динамическая библиотека должна просто предоставлять какую-то функцию init(const struct *myfuncs) или что-то подобное, и это упрощает реализацию динамической библиотеки.

Это также сделает реализацию более переносимой.

...