2009-07-16 6 views
11

Je suis nouveau sur Qt et j'ai une erreur que je n'arrive pas à résoudre.Qt/mingw32 erreurs de référence non définies ... impossibilité de lier un fichier .lib

J'ai un tas de fichier de bibliothèque statique windows (VS2005) (.lib). Et je suis en train de tester s'ils fonctionnent bien avec Qt. J'ai donc pris la bibliothèque la plus simple que j'ai. (Appelé MessageBuffer).

J'ajouté MessageBuffer.h au main.cpp, et a ajouté l'emplacement de ces fichiers dans le INCLUDEPATH du .pro. Jusqu'à ce que tout semble bien, je peux utiliser la classe et Qt IDE montrent toute la méthode et tout. Donc, pour moi, on dirait qu'il a trouvé le fichier .h.

Maintenant, j'ajouté le MessageBuffer.lib (VS2005/Debug) dans le .pro comme ceci:

LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 

J'ai également essayé les suivantes:

win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 
LIBS += -LE:/SharedLibrary/lib -lMessageBufferd 
win32:LIBS += -LE:/SharedLibrary/lib -lMessageBufferd 

Voici le contenu de mon dossier .pro :

QT += opengl 
TARGET = SilverEye 
TEMPLATE = app 
INCLUDEPATH += E:/SharedLibrary/MessageBuffer 
SOURCES += main.cpp \ 
    silvereye.cpp 
HEADERS += silvereye.h 
FORMS += silvereye.ui 
OTHER_FILES += 
win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 

Ils me donnent tous le même erro rs: (et je reçois le même, même si je ne comprennent pas le .lib)

Running build steps for project SilverEye... 
Configuration unchanged, skipping QMake step. 
Starting: C:/Qt/2009.03/mingw/bin/mingw32-make.exe -w 
mingw32-make: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
C:/Qt/2009.03/mingw/bin/mingw32-make -f Makefile.Debug 
mingw32-make[1]: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\SilverEye.exe debug/main.o debug/silvereye.o debug/moc_silvereye.o -L"c:\Qt\2009.03\qt\lib" -lopengl32 -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind E:/SharedLibrary/lib/MessageBufferd.lib -lQtOpenGLd4 -lQtGuid4 -lQtCored4 
mingw32-make[1]: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
mingw32-make: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
debug/main.o: In function `Z5qMainiPPc': 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:12: undefined reference to `MessageBuffer::MessageBuffer()' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:13: undefined reference to `MessageBuffer::Append(char*, int)' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()' 
collect2: ld returned 1 exit status 
mingw32-make[1]: *** [debug\SilverEye.exe] Error 1 
mingw32-make: *** [debug] Error 2 
Exited with code 2. 
Error while building project SilverEye 
When executing build step 'Make' 

peut-elle aider quelqu'un s'il vous plaît?

+0

Pouvez-vous poster le fichier pro que vous utilisez? –

+0

vient d'ajouter le contenu du fichier pro dans le message d'origine. –

+0

merci. fichier pro semble bien. –

Répondre

5

Basé sur la question Use libraries compiled with visual studio in an application compiled by g++ (mingw) et le forum MSDN post I can't mix VC & GCC il ne semble pas que vous pouvez lier une application gcc avec des bibliothèques compilées Visual C++.

La solution serait de tout recompiler avec le même compilateur.

+0

C'est en fait ce que j'allais poster, j'ai trouvé ceci: Ces bibliothèques, comme beaucoup d'autres paquets de développement Windows précompilés tels que la bibliothèque client MySQL, ont été compilés avec Ms Visual C++ (MSVC). MSVC et MinGW, avons-nous découvert, utilisent différentes conventions de dénomination pour les fonctions stdcall. MSVC les exporte en tant que _name @ ordininal, mais MinGW les exporte en tant que nom. Par conséquent, la génération MinGW a échoué avec des erreurs de liaison "références non définies" lors de l'appel de fonctions stdcall exportées à partir de la bibliothèque MSVC. –

+0

Veuillez regarder ici pour des solutions: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/ –

0

Je suppose que vous avez utilisé la bibliothèque MessageBuffer dans une autre application avec des problèmes. L'erreur semble ne pas pouvoir trouver la bibliothèque ou la classe MessageBuffer n'est pas exportée.

Avez-vous essayé de placer -l sur le devant de la bibliothèque dans le fichier pro?

win32:LIBS += -lE:/SharedLibrary/lib/MessageBufferd.lib 

Voir mes autres answer. J'ai ajouté l'autre réponse parce que je ne voulais pas rendre cette réponse plus désordonnée qu'elle ne l'était déjà.

Essayé jusqu'à présent:

  • Pas une faute de frappe, d est ajouté à la bibliothèque
  • En utilisant l'extension lib est correcte comme on le voit dans la sortie
+0

d est le nom réel, d est ajouté pour la version de débogage du .lib –

+0

@xcimo est logique ... je voulais juste vérifier –

+0

Je ne sais pas si la classe MessageBuffer est exportée. Je n'ai pas de mot clé "export" dans la classe messageBuffer, puisque j'ai pu utiliser cette librairie dans de nombreux autres projets Visual Studio C++. Une bibliothèque statique a-t-elle besoin d'une exportation? ou peut-être que c'est quelque chose dont Mingw a besoin? Merci pour ton aide. –

4

La FAQ MinGW traite ce problème et propose une solution:

  1. Créer un fichier de définition à l'aide PRGIE (pour les fichiers lib) ou pexports (pour les fichiers dll).
  2. Supprimez les préfixes de soulignement des fonctions stdcall.
  3. Utilisez dlltool pour convertir la bibliothèque MSVC en une bibliothèque MinGW avec la nouvelle définition.

Cela n'a pas fonctionné. Nous avons finalement enlevé les ordinaux des noms de fonctions, ce qui l'a amené à compiler. Mais le programme ne s'exécuterait pas car il ne pouvait pas trouver les fonctions liées dans la DLL. Enfin, après avoir consulté la documentation MSDN pour les fichiers de définition, nous avons modifié les instructions de construction:

  1. Créez un fichier de définition à l'aide de reimp.
  2. Pour chaque fonction stdcall (au format _name @ ordininal), ajoutez un nom de ligne = _name @ ordininal, permettant à MinGW de mapper sa convention de nommage stdcall à celle de MSVC.
  3. Utilisez dlltool pour convertir la bibliothèque MSVC en une bibliothèque MinGW avec la nouvelle définition.

Cela a fonctionné! Pour compiler le projet, vous devez simplement:

  1. Téléchargez et installez le package Qt/Windows, qui inclut MinGW.
  2. Téléchargez reimp et déposez-le dans le dossier MinGW/bin.
  3. Téléchargez les packages de développement pour les bibliothèques tierces et pointez une variable d'environnement vers cet emplacement.
  4. Générez le projet avec les commandes qmake/make habituelles.

Extrait de: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/

+0

J'essaie actuellement le plugin studio visuel pour QT, pour essayer pour construire des applications QT et utiliser le compilateur VS (et utiliser mes fichiers .lib MSVC) –

Questions connexes