2015-12-09 5 views
0

Je souhaite créer une bibliothèque dynamique (.dll) pour l'un des composants écrits en C++, utilisé dans mon travail. Deux fonctions sont déclarées en tant qu'ext dans un fichier .h et sont référencées dans le fichier .cpp correspondant. En les reliant, je reçois une erreur de symbole non résolue.Comment lier une fonction déclarée comme extern dans un fichier .h, pour créer un fichier .dll?

xxxx.obj: erreur LNK2019: symbole externe non résolu "int __cdecl run_xxx (int, char * * const, struct st_xx *)" (run_xxx @@ YAHHQEAPEADPEAUst_xx @@@ Z?) Référencé dans la fonction « int __cdecl start_xx (int, int, int, char * * const) "(? start_xx @@ YAHHHHQEAPEAD @ Z)

L'utilisation de ces fonctions est comme, ils doivent être définis par n'importe quelle application utilisant cette bibliothèque. La définition de ces fonctions ne sera donc que dans l'application utilisant cette bibliothèque. Ainsi, je ne pouvais pas ajouter d'autres bibliothèques ayant la définition de ces API lors de la liaison.

Comment les API externes doivent-elles être gérées lors de la création d'une DLL?

Répondre

2

La DLL ne peut pas lier à des fonctions dans l'application comme si la DLL et l'application était un grand programme C++. Une DLL Windows ressemble plus à un exécutable: elle ne ressemble pas à la bibliothèque statique C ou C++.

L'approche la plus simple consiste à laisser l'application passer des pointeurs vers les fonctions de rappel/personnalisation, vers la DLL, dans un appel d'initialisation. Plus haut niveau, vous pouvez passer une interface à la DLL. Une troisième alternative est que les fonctions sont fournies par leur propre DLL que l'application doit fournir.


Il y a aussi une approche sale de bas niveau possible en fonction du fait que les deux exécutables et les DLL utilisent le format Portable Executable, donc en principe un exécutable peut exporter des fonctions pour la consommation par une DLL, en effet agissant à la fois exécutable et DLL. Cependant, il y a si longtemps que j'ai fait des choses à ce niveau que je ne peux pas garantir que c'est faisable, et de toute façon je le recommande.

+0

Merci @Cheers et hth. - Alf. Passer le pointeur ou l'interface serait une bonne idée, mais dans mon cas un grand nombre d'applications utilisent ce composant. Modifier dans toutes ces applications semble très impossible. – JOE