функция, которая возвращает значение из dlsym ()? - PullRequest
1 голос
/ 06 марта 2011

Глупый вопрос, который, я уверен, немного синтаксис, который не так. Как заставить dlsym работать с функцией, которая возвращает значение? Я получаю сообщение об ошибке «недопустимое преобразование void * в LSError (*) ()» в следующем коде - пытаюсь скомпилировать пример программы linux lightscribe, надеясь, что смогу связать ее с OSX dylib (почему ад выиграл HP выпускает настоящий Cocoa SDK? LS существует всего 6 или 7 лет?):

void* LSHandle = dlopen("liblightscribe.1.dylib", RTLD_LOCAL|RTLD_LAZY);
    if (LSHandle) {
        LSError (*LS_DiscPrinter_ReleaseExclusiveUse)() = dlsym(LSHandle, "LS_DiscPrinter_ReleaseExclusiveUse");

..
lsError = LS_DiscPrinter_ReleaseExclusiveUse( pDiscPrinter);

1 Ответ

3 голосов
/ 06 марта 2011

Стандарт C на самом деле не определяет поведение для преобразования в и из указателей на функции.Объяснения различаются относительно того, почему;Наиболее распространенным является то, что не все архитектуры реализуют указатели функций как простые указатели на данные.На некоторых архитектурах функции могут находиться в совершенно другом сегменте памяти, который не может быть адресован с использованием указателя на void.

«Рекомендуемый» способ использования dlsym:

 LSError (*LS_DiscPrinter_ReleaseExclusiveUse)(LS_DiscPrinterHandle);

 *(void **)&LS_DiscPrinter_ReleaseExclusiveUse = dlsym("LS_DiscPrinter_ReleaseExclusiveUse");

Прочитайте обоснование и пример на странице POSIX для dlsym для получения дополнительной информации.

...