Votre question

[resolu] visual C++ compilation et librairie .lib ou .dll

Tags :
  • Dll
  • Programmation
Dernière réponse : dans Programmation
5 Mars 2006 18:00:35

Bonjour,

J ai un probleme avec Visual C++.
Je souhaite creer une interface graphique qui se serve d une bibliotheque.
Je dispose des .h et des .cpp et souhaite a partir de ces programmes creer une bibliotheques que l on puisse integrer dans visual C++.
Ca fait deja un petit moment que je cherche par moi meme une solution mais je tombe toujours sur des problemes divers.
J ai deja essaye d integrer un fichier .lib qui est cree a partir de la console visual. Mais la j arrive a un probleme entre multi thread dynamique et statique.
Par la suite j ai essaye de creer directement une dll dans mon projet ( option choisie MFC DLL puis apres une dll dynamique)me disant que la solution de la lib ne pouvait pas marcher.
Mais je n arrive pas a creer la dll. J obtiens tjs un message du type LNK2019: unresolved external symbol.
Dans cette bibliotheque je veux incorporer des classes. Et le linkage bloque sur les constructeurs et destructeurs.

Visual C++ comporte de nombreux parametres a regler.
Si vous savez d ou vient mon probleme ou alors connaissez un site bien fait ou je puisse trouver une solution, n hesitez pas a repondre.

Merci

Autres pages sur : resolu visual compilation librairie lib dll

6 Mars 2006 09:26:46

Donc je vais essayer de decomposer le probleme et d etre plus precis

Comment peut on integrer une classe et ses methodes dans une dll


Ca compile mais je pense que l erreur vient de la
Le compilateur ne doit pas bien creer la dll.


------ Rebuild All started: Project: ComplexC, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'ComplexC', configuration 'Debug|Win32'
Compiling...
stdafx.cpp
Compiling...
ComplexC.cpp
rter.cpp
test.cpp
Generating Code...
Compiling resources...
Compiling manifest to resources...
Linking...
LINK : C:\ComplexA\Debug\ComplexC.dll not found or not built by the last incremental link; performing full link
Creating library C:\ComplexA\Debug\ComplexC.lib and object C:\ComplexA\Debug\ComplexC.exp
Embedding manifest...
Build log was saved at "file://c:\ComplexA\ComplexC\Debug\BuildLog.htm"
ComplexC - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========


Et voila ce que j obtient quand je compile le projet general.

------ Rebuild All started: Project: ComplexA, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'ComplexA', configuration 'Debug|Win32'
Compiling...
stdafx.cpp
Compiling...
ComplexA.cpp
ComplexADlg.cpp
Generating Code...
Compiling resources...
Compiling manifest to resources...
Linking...
ComplexADlg.obj : error LNK2019: unresolved external symbol "public: __thiscall test::~test(void)" (??1test@@QAE@XZ) referenced in function "public: void __thiscall CComplexADlg::o nBnClickedOk(void)" (?OnBnClickedOk@CComplexADlg@@QAEXXZ)
ComplexADlg.obj : error LNK2019: unresolved external symbol "public: __thiscall test::test(void)" (??0test@@QAE@XZ) referenced in function "public: void __thiscall CComplexADlg::o nBnClickedOk(void)" (?OnBnClickedOk@CComplexADlg@@QAEXXZ)
C:\ComplexA\Debug\ComplexA.exe : fatal error LNK1120: 2 unresolved externals
Build log was saved at "file://c:\ComplexA\ComplexA\Debug\BuildLog.htm"
ComplexA - 3 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========


Merci pour votre aide
a b L Programmation
6 Mars 2006 13:23:45

Quand tu compiles ta dll, il te faut indiquer les fonctions et classes qui seront exportée (via le fichier .lib)
Tu peux modifier à la main le fichier .exp pour indiquer ce que tu veux importer, mais la meilleure méthode est celle-ci:
1. tu crées ta fonction dans un fichier .c ou .cpp qui sera compilé
2. tu crées le ficheir .h avec le prototype de la fonction
3. sur les prototypes des fonctions que tu souhaite exporter, tu ajoutes la directive de précompilation __declspec( dllexport ) pour indiquer au compilateur que la fonction doit être exporté (visible de l'extérieur de la dll et code non partagé)
4. tu compiles ta DLL qui génère un .exp, .lib et un .dll
5. dans ton autre projet, tu fais des include des .h, tu lies (link) la compilation de l'exe avec le fichier .lib
6. Tu mets le .dll à côté de l'exe ou dans le répertoire système pour pouvoir lancer l'exe

Bref tout ça pour dire qu'il faut mettre le dllexport. Exemples:
  1. #define DLL_EXPORT __declspec( dllexport )
  2.  
  3. DLL_EXPORT void function();
  4. DLL_EXPORT class MyClass
  5. {
  6. ...
  7. };
Contenus similaires
6 Mars 2006 14:09:01

Si je peux me permettre un petit ajout à ton exemple CRicky.

Dans mes projets où je crée une DLL, j'ai l'habitude de de faire ça :
  1. #ifdef DLL_EXPORT
  2. #define DllImportExport __declspec( dllexport )
  3. #else
  4. #define DllImportExport __declspec( dllimport )
  5. #endif

Et tu ajoutes DLL_EXPORT dans les définitions du préprocesseur.
De cette façon, lorsque tu compiles ton projet, la variable DLL_EXPORT est connu et tu exportes bien tes fonctions.
Lorsque tu utilises ton .h et ton .lib dans un autre projet pour utiliser ta DLL, ton projet nouveau projet ne déclarant pas la variable DLL_EXPORT, tu importes bien les fonctions.
a b L Programmation
6 Mars 2006 19:21:01

oui c'est effectivement plus propre.
7 Mars 2006 13:25:51

Merci pour les renseignements. Donc j arrive a bien compiler une fonction mais pas la classe. Entout cas, je crois qu il n y arrive pas. La fonction (ce n est pas une methode de la classe) et la classe sont dans le meme fichier, donc normalement les directives preprocesseurs et le linkage est bien fait.



------ Rebuild All started: Project: ComC, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'ComC', configuration 'Debug|Win32'
Compiling...
ComC.cpp
c:\comc\comc\comc.h(51) : warning C4091: '__declspec(dllexport)' : ignored on left of 'test' when no variable is declared
Compiling manifest to resources...
Linking...
LINK : C:\ComC\Debug\ComC.dll not found or not built by the last incremental link; performing full link
Creating library C:\ComC\Debug\ComC.lib and object C:\ComC\Debug\ComC.exp
Embedding manifest...
Build log was saved at "file://c:\ComC\ComC\Debug\BuildLog.htm"
ComC - 0 error(s), 1 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========



voila ma classe, qui est place dans le .h:

DLL_EXPORT class test {
//DECLARE_DYNAMIC(test)


public:
test ();
~test ();
//test();
//virtual ~test();
test(const test &clone);
int a;
int b;
test getValue(int element1, int element2);
test addInt(test element1, test element2);

//protected:

};

Je sais que c est pas tres bien implemente mais le seul but de cette classe est de voir comment ca marche (creer une dll) pour apres l appliquer a un projet plus complique.

Merci de votre aide
7 Mars 2006 14:12:31

Si tu lis bien le message d'erreur :
Citation :

c:\comc\comc\comc.h(51) : warning C4091: '__declspec(dllexport)' : ignored on left of 'test' when no variable is declared

Ceci veut dire que si tu mets "__declspec(dllexport)" avant "class" le symbole est ignoré.
En gros, la subtilité est la suivante, quand tu fais ça:
  1. __declspec(dllexport) class toto{...} maclasse;

alors c'est maclasse qui est exporté.
par contre si tu fais
  1. class __declspec(dllexport) toto{...};

alors c'est bien la classe qui est exporté.
Ce que te dit le message d'erreur, qui est en fait un warning, c'est qu'en faisant ça :
  1. __declspec(dllexport) class toto{...};

tu te placerais dans mon premier cas sauf que tu ne déclare aucune variable, donc il ignore l'exportation.
a b L Programmation
7 Mars 2006 19:01:32

Oui, j'avais oublié d'inverser class et DLL_EXPORT. :roll:
9 Mars 2006 20:01:33

Merci les gars pour votre aide
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS