[C++ / Qt4] Problème de link avec Visual C++ 2005

Problème de link avec Visual C++ 2005 [C++ / Qt4] - C++ - Programmation

Marsh Posté le 05-10-2007 à 00:08:40    

Salut,
 
Je commence à tatter un peu de la programmation qt et j'essaye de faire un prog utilisant QtSql, pour m'entrainer je suis parti de la base du QHelloWorld et j'y ajoute du code au grai de mes envies :D, j'ai donc essayé de faire quelque chose avec un QSqlQuery, j'ai donc pour l'instant simplement ajouté un

Code :
  1. #include <QSqlQuery>


au début de mon fichier main.cpp et dans le code de la fonction main(...) simplement:

Code :
  1. QSqlQuery query;


Je tente la compile et là erreur de link:

Citation :

Actions de projet Makefile en cours
Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation. Tous droits r
 "C:\Program Files\Microsoft Visual Studio 8\VC\bin\nmake.exe" -f Makefile.Debug
Microsoft (R) Program Maintenance Utility Version 8.00.50727.42
Copyright (C) Microsoft Corporation. Tous droits r
 cl -c -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W3 -DUNICODE -DQT_LARGEFILE_SUPPORT -DWIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"e:\qt4\include\QtCore" -I"e:\qt4\include\QtCore" -I"e:\qt4\include\QtGui" -I"e:\qt4\include\QtGui" -I"e:\qt4\include" -I"." -I"e:\qt4\include\ActiveQt" -I"debug" -I"." -I"e:\qt4\mkspecs\default" -Fodebug\ @C:\DOCUME~1\gluttony\LOCALS~1\Temp\nm94.tmp
main.cpp
 link /LIBPATH:"e:\qt4\lib" /NOLOGO /DEBUG /SUBSYSTEM:WINDOWS /incremental:no /OUT:"debug\HelloWorldQt.exe" @C:\DOCUME~1\gluttony\LOCALS~1\Temp\nm95.tmp
main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) public: __thiscall QSqlDatabase::~QSqlDatabase(void)" (__imp_??1QSqlDatabase@@QAE@XZ) référencé dans la fonction __unwindfunclet$_main$0
main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) public: __thiscall QSqlQuery::~QSqlQuery(void)" (__imp_??1QSqlQuery@@QAE@XZ) référencé dans la fonction _main
main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) public: __thiscall QSqlQuery::QSqlQuery(class QString const &,class QSqlDatabase)" (__imp_??0QSqlQuery@@QAE@ABVQString@@VQSqlDatabase@@@Z) référencé dans la fonction _main
main.obj : error LNK2019: symbole externe non résolu "__declspec(dllimport) public: __thiscall QSqlDatabase::QSqlDatabase(void)" (__imp_??0QSqlDatabase@@QAE@XZ) référencé dans la fonction _main
debug\HelloWorldQt.exe : fatal error LNK1120: 4 externes non résolus
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\bin\link.EXE"'á: code retour '0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\bin\nmake.exe"'á: code retour '0x2'
Stop.
Project : error PRJ0019: Un outil a retourné un code d'erreur à partir de "Actions de projet Makefile en cours"


Je ne comprend pas pourquoi ça plante, dans le link il y a bien "e:\qt4\lib" qui comprend la librairie QtSql4.lib
 
Si quelqu'un a une idée de ce que je fais de travers ça serait cool car là je n'arrive pas à voir.
J'ai vu dans un Makefile d'un exemple Qt qu'il y avait à un endroit un -DQT_SQL_LIB, où peut-on le rajouter dans le projet Visual C++ 2005?
 
Merci, @+.

Reply

Marsh Posté le 05-10-2007 à 00:08:40   

Reply

Marsh Posté le 05-10-2007 à 02:04:07    

Salut,
 
Il suffit d'ajouter QT += sql à ton .pro et tout le module sql sera disponible.
 
Edit: et si tu n'utilises pas de .pro, alors il faut que tu ajoutes QtSql4d.lib et QtSql4.lib à la config du lieur (respectivement pour la compilation en debug et release; si tu n'as compilé Qt qu'en release, tu mets juste QtSq4.lib aux 2 types de config et zou)


Message édité par IrmatDen le 05-10-2007 à 02:47:20
Reply

Marsh Posté le 05-10-2007 à 09:00:56    

Ok, merci,
 
J'utilise bien un .pro mais quand je le modifie manuellement, VC++ 2005 en regénère un manuellement, pour l'ajout de lib au linker je n'arrive pas à trouver où, mais dans tous les cas vu que le répertoire "e:\qt4\lib" est défini (et bien reconnu car il voit la lib QtGui4.lib pour QApplication et QPushButton) je pense que la lib est bien vue, enfin je peux toujours essayer de les ajouter quand même si je trouve. Tu sais où sait pour VC++ 2005? Je savais pour VC++6 mais là pas trouvé.
 
Mais je pense plus que le problème vient du -DQT_SQL_LIB qui n'est pas présent, d'ailleurs pour la partie Gui on voit bien dans la commande que -DQT_GUI_LIB est présent. Et pareil que pour le "QT += sql", si je rajoute manuellement le -DQT_SQL_LIB dans le makefile, il est regénéré par VC++ 2005 et donc les modifications sont perdues.
 
Help please :d.
@+

Reply

Marsh Posté le 05-10-2007 à 11:19:52    

grostony a écrit :

Ok, merci,
 
J'utilise bien un .pro mais quand je le modifie manuellement, VC++ 2005 en regénère un manuellement, pour l'ajout de lib au linker je n'arrive pas à trouver où, mais dans tous les cas vu que le répertoire "e:\qt4\lib" est défini (et bien reconnu car il voit la lib QtGui4.lib pour QApplication et QPushButton) je pense que la lib est bien vue, enfin je peux toujours essayer de les ajouter quand même si je trouve. Tu sais où sait pour VC++ 2005? Je savais pour VC++6 mais là pas trouvé.


Ca c'est parce que tu as qmake -project dans ta ligne de build. Il ne faut surtout pas l'y mettre pour cette raison. Le qmake -project, tu le fais manuellement en cli dans le rep de ton projet. Après, tu ajoutes le .pro à l'arbo de ta solution dans VC pour l'avoir à portée de souris et le modifier sans galérer.
Dans les commandes de build:
> Build command line: qmake && nmake all
> Rebuild all: nmake distclean && nmake all
> Clean command line: nmake distclean
(Tu peux éventuellement remplacer distclean par clean, mais le premier à l'avantage d'aussi supprimer les makefiles générés, ce qui peut se révéler assez pratique dans certains cas ;))
 

grostony a écrit :

Mais je pense plus que le problème vient du -DQT_SQL_LIB qui n'est pas présent, d'ailleurs pour la partie Gui on voit bien dans la commande que -DQT_GUI_LIB est présent. Et pareil que pour le "QT += sql", si je rajoute manuellement le -DQT_SQL_LIB dans le makefile, il est regénéré par VC++ 2005 et donc les modifications sont perdues.


Les Makefiles sont générés par qmake [unfichier.pro]. Donc il faut résoudre à la source, ça ne sert *à rien* de se palucher des modifs de makefile à la mano à chaque génération.

Reply

Marsh Posté le 05-10-2007 à 12:38:29    

Ok merci pour toutes ces infos (j'ai bien un qmake -project dans mes lignes de build/rebuild), je testerai ce soir en retrant chez moi.
@+

Reply

Marsh Posté le 05-10-2007 à 12:44:19    

Pardon, la phrase suivante n'était pas compléte:

IrmatDen a écrit :

Ca c'est parce que tu as qmake -project dans ta ligne de build.


[...] lorsque tu viens de créer ton projet.
 
Voilà :)

Reply

Marsh Posté le 05-10-2007 à 13:40:08    

Bah en fait en partant d'un projet vide il n'y a rien dans la ligne de build (je crois car dans des tutos ils disent, de mettre ci et ça ici et là), c'est en glanant des infos (plus ou moins valables :d) que j'ai touvé ça, que j'ai mis manuellement et que la compilation à marché (pour le simple QHelloWorld).


Message édité par grostony le 05-10-2007 à 13:41:22
Reply

Marsh Posté le 05-10-2007 à 14:37:12    

Ce que je voulais dire (j'ai coupé le mauvais morceau :sweat:), c'est de taper ça en ligne de commande dans le répertoire de ton projet à sa création. Tu ajoutes une entrée au menu outil pour ouvrir une console dans le projet, et tu le feras sans même y penser au bout de 2 fois.

Reply

Marsh Posté le 05-10-2007 à 15:26:52    

IrmatDen a écrit :

Ce que je voulais dire (j'ai coupé le mauvais morceau :sweat:), c'est de taper ça en ligne de commande dans le répertoire de ton projet à sa création.


Je ne sais pas si je te suis complètement là, tu veux dire, genre si mon projet est situé dans D:\Projets\QHelloWorld, lancer l'invité de commande MS DOS et tapper:

Citation :

C:\> d:
D:\> cd Projets\QHelloWorld
D:\Projets\QHelloWorld> cd <chemin vers le makefile (je ne sais plus s'il est à la racine du projet)>
D:\Projets\QHelloWorld\<...>> qmake -project


 

IrmatDen a écrit :

Tu ajoutes une entrée au menu outil pour ouvrir une console dans le projet, et tu le feras sans même y penser au bout de 2 fois.


Là je te suis encore moins, c'est dans le menu outils de VC++ 2005? Si oui comment faire.
 
Merci encore :d.


Message édité par grostony le 05-10-2007 à 15:46:36
Reply

Marsh Posté le 05-10-2007 à 16:10:33    

Pour rendre facilement la console à partir de VS:
1. Cliques sur Tools / External tools...
2. Ca t'ouvre une fenêtre avec la liste des outils non integrés à VS (d'où le nom external...)
3. CG sur Add
4. > Title: [le titre de l'outil ajouté] (par exemple "CLI in Solution directory" )
    > Command: cmd.exe
    > Arguments: [laisse vide]
    > Initial directory: utilise la valeur spéciale "$(SolutionDir)"
5. Ok
 
Ensuite, après création d'un projet, tu cliques sur ton outil nouvellement créer. Une console devrait s'ouvrir exactement dans le répertoire de ton .sln. Si c'est le répertoire racine de ton projet (disons donc "D:\Projets\QHelloWorld" ), tu y tapes: qmake -project && exit
Si tu as une arborescence particulière où le sln n'est pas le répertoire racine de ton projet (disons: "D:\Projets\QHelloWorld\build_systems\msvc2005" ), alors il te faudra remonter à la racine pour avoir ton .pro correct.
La raison étant que le qmake -project analyse le répertoire en cours + les sous-répertoires. Mais il ne remonte pas ;)

Reply

Marsh Posté le 05-10-2007 à 16:10:33   

Reply

Marsh Posté le 05-10-2007 à 16:23:51    

Oki doki, merci pour tout, j'essaye tout ça ce soir.
@+

Reply

Marsh Posté le 05-10-2007 à 18:41:33    

magnifique, tout marche niquel avec tes conseils.
Merci encore.
@+

Reply

Marsh Posté le 05-10-2007 à 18:55:50    

De rien, enjoy ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed