Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
775 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [VC++] Classe dans une DLL : fonctions virtuelles et erreur LNK2001

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VC++] Classe dans une DLL : fonctions virtuelles et erreur LNK2001

n°160867
smaragdus
whores, drugs & J.S. Bach
Posté le 17-06-2002 à 15:03:44  profilanswer
 

J'ai un EXE qui contient les fichiers de la classe Facade : Facade.h & Facade.cpp
 
J'ai une DLL (linkée dynamiquement) qui contient juste Facade.h
 

Code :
  1. class Facade {
  2. public:
  3.   int zeData;
  4.   int zeMethode();
  5.   virtual int virtMethode();
  6. };


 
Ma DLL reçoit un pointeur sur une instance (créée dans l'EXE) de Facade : Facade* pFacade mais j'ai un problème :
Dans la DLL, je peux accéder à pFacade->zeData et pFacade->virtMethode() mais pas à pFacade->zeMethode(), j'obtiens la classique erreur 'LNK2001' à la compilation.
 
Question : pourquoi cette LNK2001 ??? Je sais bien qu'il y a une vtable pour les virtuelles mais pourquoi la DLL ne peut pas accéder à une simple méthode ?  :??:

mood
Publicité
Posté le 17-06-2002 à 15:03:44  profilanswer
 

n°160879
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-06-2002 à 15:10:28  profilanswer
 
n°160886
smaragdus
whores, drugs & J.S. Bach
Posté le 17-06-2002 à 15:13:23  profilanswer
 

antp a écrit a écrit :

c'est la mode de cette erreur ?
http://forum.hardware.fr/forum2.php3?post=21494&cat=10  




 
Merci pour cette utile intervention  :sarcastic:


Message édité par smaragdus le 17-06-2002 à 15:22:29
n°160905
chrisbk
-
Posté le 17-06-2002 à 15:24:24  profilanswer
 

ben c normale, pour une fonction il faut forcement l'implantation de ladite fonction . fo inclure le cpp dans la dll


Message édité par chrisbk le 17-06-2002 à 15:25:17
n°160906
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-06-2002 à 15:24:43  profilanswer
 

bhen en allant lire cet autre post ça t'aidera peut-être à résoudre le problème :na:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°160909
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-06-2002 à 15:26:29  profilanswer
 

smaragdus> as tu inclus le .lib correspondant à ta DLL dans ton projet ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°161763
smaragdus
whores, drugs & J.S. Bach
Posté le 18-06-2002 à 14:32:41  profilanswer
 

Harkonnen a écrit a écrit :

smaragdus> as tu inclus le .lib correspondant à ta DLL dans ton projet ?  




 
Non, je n'ai pas inclus le lib de la DLL dans l'EXE car j'effectue le lien de l'unique fonction exportée avec GetProcAdress. Je procède ainsi afin de pouvoir recompiler la DLL sans avoir à recompiler l'EXE.
 
Le problème vient du fait que la DLL ne peut pas appeler une méthode non-virtuelle d'un objet passé à la DLL. Si la méthode est virtuelle, le late-binding (qui utilise les vtables, non ?) permet de contourner le problème.
 
chrisbk> Non je n'ai pas inclu le cpp dans la DLL puisqu'il est déjà inclu dans l'EXE.


Message édité par smaragdus le 18-06-2002 à 15:52:03
n°161768
youdontcar​e
Posté le 18-06-2002 à 14:36:10  profilanswer
 

manque pas un dllexport / import ?

n°161834
smaragdus
whores, drugs & J.S. Bach
Posté le 18-06-2002 à 15:29:59  profilanswer
 

youdontcare a écrit a écrit :

manque pas un dllexport / import ?  




 
Ben non, je n'utilise pas les '.lib'

n°161998
smaragdus
whores, drugs & J.S. Bach
Posté le 18-06-2002 à 17:28:27  profilanswer
 

Bon ben, ne cherchez plus.  
Ca marche très bien avec des méthodes virtuelles donc c'est OK pour moi.

mood
Publicité
Posté le 18-06-2002 à 17:28:27  profilanswer
 

n°162008
BENB
100% Lux.
Posté le 18-06-2002 à 17:46:47  profilanswer
 

Smaragdus a écrit a écrit :

 
 
Ben non, je n'utilise pas les '.lib'  




Ben justement tu devrais :D
c'est de la que viens ton Pb
il faut que tu ajoutes le .lib et le declspec(dllimport/dllexport)

n°162010
smaragdus
whores, drugs & J.S. Bach
Posté le 18-06-2002 à 17:48:08  profilanswer
 

BENB a écrit a écrit :

 
Ben justement tu devrais :D
c'est de la que viens ton Pb
il faut que tu ajoutes le .lib et le declspec(dllimport/dllexport)  




 
Comme je l'ai dit plus haut, je ne peux pas utiliser les .lib car je ne veux pas recompiler l'exe à chaque nouvelle version de la DLL.
 
Et puis si le problème venait de là, je ne pourrais pas accéder à la classe, non ? :??:


Message édité par smaragdus le 18-06-2002 à 17:51:49
n°162013
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-06-2002 à 17:50:32  profilanswer
 

Pourquoi recompiler l'exe au fait ? A partir du moment ou tu changes pas le nom des fonctions de ta DLL et leurs arguments, tu n'as pas à recompiler l'exe je pense.


---------------
J'ai un string dans l'array (Paris Hilton)
n°162014
BENB
100% Lux.
Posté le 18-06-2002 à 17:51:54  profilanswer
 

Smaragdus a écrit a écrit :

 
 
Comme je l'ai dit plus haut, je ne peux pas utiliser les .lib car je ne veux pas recompiler l'exe à chaque nouvelle version de la DLL.  




Sauf qu'ici c'est dans l'autre sens...
 
c'est le .lib de l'exe que tu dois mettre dans la Dll
declspec(dllexport) dans l'exe.
declspec(dllimport) dans la dll...
 
evidement le plus propre serait sans doute d'avoir 2 Dlls :
le nouvelle Dll exportant facade pour l'exe et ta Dll...
Mais ne soyons pas plus royalistes que le roi. :D Si cette Dll ne doit pas etre utilisée par un autre exe, il n'y a pas de problème... Dans le cas contraire...


Message édité par BENB le 18-06-2002 à 17:55:33
n°162018
smaragdus
whores, drugs & J.S. Bach
Posté le 18-06-2002 à 17:58:17  profilanswer
 

BENB a écrit a écrit :

 
Sauf qu'ici c'est dans l'autre sens...
 
c'est le .lib de l'exe que tu dois mettre dans la Dll
declspec(dllexport) dans l'exe.
declspec(dllimport) dans la dll...
 
evidement le plus propre serait sans doute d'avoir 2 Dlls :
le nouvelle Dll exportant facade pour l'exe et ta Dll...
Mais ne soyons pas plus royalistes que le roi. :D Si cette Dll ne doit pas etre utilisée par un autre exe, il n'y a pas de problème... Dans le cas contraire...  




 
 
Le lib de l'EXE ?  :heink: Je pensais que ça existait seulement pour les librairies type DLL. Je vais tester ça tout de suite.

n°162022
BENB
100% Lux.
Posté le 18-06-2002 à 18:01:23  profilanswer
 

Smaragdus a écrit a écrit :

 
 
 
Le lib de l'EXE ?  :heink: Je pensais que ça existait seulement pour les librairies type DLL. Je vais tester ça tout de suite.  




Bien sur, le code d'implementation de ta classe se trouve dans l'exe, non ? Donc c'est à lui d'exporter le code...
le .lib apparaitra dès que tu mettras un declspec(dllexport) quelque part dedans...
 
Par contre attention ta Dll ne pourra plus etre linkée qu'avec ce prog.

n°162627
smaragdus
whores, drugs & J.S. Bach
Posté le 19-06-2002 à 15:47:44  profilanswer
 

BENB a écrit a écrit :

 
Bien sur, le code d'implementation de ta classe se trouve dans l'exe, non ? Donc c'est à lui d'exporter le code...
le .lib apparaitra dès que tu mettras un declspec(dllexport) quelque part dedans...
 
Par contre attention ta Dll ne pourra plus etre linkée qu'avec ce prog.  




 
Ca marche nickel, merci BENB  :jap:  
Sinon pour le dernier point, c'est pas un problème puisque c'est un SDK.

n°162658
BENB
100% Lux.
Posté le 19-06-2002 à 15:59:45  profilanswer
 

Smaragdus a écrit a écrit :

 
 
Ca marche nickel, merci BENB  :jap:  
Sinon pour le dernier point, c'est pas un problème puisque c'est un SDK.  




Il ne faut non plus renommer ton prog (l'exe) ! sinon il sera impossible de charger ta Dll :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [VC++] Classe dans une DLL : fonctions virtuelles et erreur LNK2001

 

Sujets relatifs
[SDL + thread + DLL] Est-il possible de faire un mélange des trois ?passage de variable erreur de debutant??
SQL debutant cherche erreur syntaxe [resolu][VB6]Une erreur que je comprends pas la !
[PHP] Utilisation d'une classe objet en tant que variable globaleerreur creation de table
Aidez moi sur quelques fonctions en c++ Merci !! :-)[JAVA] erreur lors de l'installation de jedit PB de -jar
4 fonctions javascripts que je viens de faire ! Et elles marchentavec quel soft peut-on lire les DLL de façon "textuelle"
Plus de sujets relatifs à : [VC++] Classe dans une DLL : fonctions virtuelles et erreur LNK2001


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR