fonction qui renvoie la valeur de dlsym ()?

La question stupide que je suis sûr est quelque peu de syntaxe qui ne va pas. Comment faire en sorte que dlsym fonctionne avec une fonction qui renvoie une valeur? J’obtiens l’erreur ‘conversion invalide de void * en LSError (*) ()’ dans le code suivant – j’essaie d’obtenir le programme exemple comstackr le programme Linux Lightscribe en espérant que je puisse le lier au dylib OSX (pourquoi diable a gagné HP ne publie-t-il pas un SDK Cocoa? LS n’est disponible que depuis 6 ans ou 7 ans?):

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); 

La norme C ne définit pas réellement le comportement pour la conversion vers et depuis les pointeurs de fonction. Les explications varient quant à pourquoi; le plus commun étant que toutes les architectures n’implémentent pas les pointeurs de fonction en tant que simples pointeurs de données. Sur certaines architectures, les fonctions peuvent résider dans un segment de mémoire totalement différent qui est non adressable à l’aide d’un pointeur sur void.

La méthode recommandée pour utiliser dlsym est la suivante:

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

Lisez la justification et l’exemple sur la page POSIX de dlsym pour plus d’informations.