2009-07-16 8 views
11

Ich bin neu in Qt und habe einen Fehler, den ich nicht beheben kann.Qt/mingw32 undefined Referenzfehler ... ich bin nicht in der Lage eine .lib zu verknüpfen

Ich habe eine Reihe von Windows (VS2005) statische Bibliotheksdatei (.lib). Und ich teste, ob sie gut mit Qt funktionieren. Also nahm ich die einfachste Bibliothek, die ich habe. (Angerufen MessageBuffer).

So habe ich MessageBuffer.h zum main.cpp, und hinzugefügt, um die Lage dieser Datei im INCLUDEPATH der .pro.

Bis dann alles in Ordnung scheint, kann ich die Klasse und Qt IDE zeigen alle Methoden und alles. Für mich sieht es so aus, als hätte es die .h-Datei gefunden.

Jetzt habe ich hinzugefügt, um die MessageBuffer.lib (VS2005/Debug Build) im .pro wie folgt aus:

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

Ich habe versucht, auch die folgenden:

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

Hier ist der Inhalt meiner .pro Datei :

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 

Sie alle geben mir den gleichen Fehler rs: (und ich das gleiche bekommen, auch wenn ich nicht enthalten die .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' 

Kann mir jemand bitte helfen?

+0

Könnten Sie die Pro-Datei schreiben Sie verwenden? –

+0

hat gerade den Inhalt der Profildatei in der ursprünglichen Nachricht hinzugefügt. –

+0

danke. Pro-Datei sieht gut aus. –

Antwort

5

Auf der Grundlage der Frage Use libraries compiled with visual studio in an application compiled by g++ (mingw) und das MSDN forum post I can't mix VC & GCC es scheint, Sie können eine Gcc-Anwendung mit Visual C++ kompilierten Bibliotheken verknüpfen.

Die Lösung wäre, alles mit dem gleichen Compiler neu zu kompilieren.

+0

Dies ist eigentlich, was ich posten wollte, fand ich: Diese Bibliotheken, wie viele andere vorkompilierte Windows-Entwicklungspakete wie die MySQL-Client-Bibliothek, wurden mit MS Visual C++ (MSVC) kompiliert. MSVC und MinGW verwenden unterschiedliche Namenskonventionen für Stdcall-Funktionen. MSVC exportiert sie als _name @ ordinal, aber MinGW exportiert sie als Name. Dies führte dazu, dass das MinGW-Build mit Verbindungsfehlern "undefined references" beim Aufruf von stdcall-Funktionen, die aus der MSVC-Bibliothek exportiert wurden, fehlschlug. –

+0

Bitte hier nach Lösungen suchen: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-micw-projects/ –

0

Ich nehme an, dass Sie die MessageBuffer-Bibliothek in einer anderen Anwendung mit Problemen verwendet haben. Der Fehler sieht so aus, als ob er die Bibliothek entweder nicht finden kann oder die MessageBuffer-Klasse nicht exportiert wird.

Haben Sie versucht, -l auf der Vorderseite der Bibliothek in der Profildatei einzufügen?

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

Siehe meine anderen answer. Ich fügte die andere Antwort hinzu, weil ich diese Antwort nicht unordentlicher machen wollte, als sie bereits war.

bisher versucht:

  • kein Tippfehler, d in die Bibliothek angehängt wird
  • die lib Erweiterung zu verwenden ist korrekt, wie in der Ausgabe
  • gesehen
+0

d ist der eigentliche Name, d ist für die Debug-Version der .lib hinzugefügt –

+0

@xcimo macht Sinn ... wollte nur überprüfen –

+0

Ich weiß nicht, ob MessageBuffer-Klasse exportiert wird. Ich habe kein "Export" -Schlüsselwort in der MessageBuffer-Klasse, da ich diese Bibliothek in vielen anderen Visual Studio C++ - Projekten verwenden konnte. Benötigt eine statische Bibliothek einen Export? oder vielleicht ist es etwas, das Mingw braucht? Danke fürs Helfen. –

4

Die MinGW FAQ diskutiert dieses Problem und bietet eine Lösung:

  1. eine Definitionsdatei erstellen reimp (zum lib-Dateien) oder pexports (für DLL-Dateien).
  2. Entfernen Sie die Unterstrichpräfixe von den stdcall-Funktionen.
  3. Verwenden Sie dlltool, um die MSVC-Bibliothek in eine MinGW-Bibliothek mit der neuen Definition zu konvertieren.

Das hat nicht funktioniert. Wir haben schließlich die Ordinalzahlen aus den Funktionsnamen entfernt, wodurch sie kompiliert wurde. Aber das Programm würde nicht ausgeführt, weil es die verknüpften Funktionen in der DLL nicht finden konnte. Schließlich haben wir nach dem Lesen der MSDN-Dokumentation für Definitionsdateien die Erstellungsanweisungen geändert:

  1. Erstellen Sie eine Definitionsdatei mit Hilfe von Reim.
  2. Fügen Sie für jede stdcall-Funktion (formatiert als _name @ ordinal) eine Zeile name = _name @ ordinal hinzu, damit MinGW seine Namenskonvention stdcall der von MSVC zuordnen kann.
  3. Verwenden Sie dlltool, um die MSVC-Bibliothek in eine MinGW-Bibliothek mit der neuen Definition zu konvertieren.

Es hat funktioniert! Um das Projekt zu kompilieren, müssen Sie einfach:

  1. Downloaden und installieren Sie das Qt/Windows-Paket, das MinGW enthält.
  2. Laden Sie die Datei herunter und legen Sie sie im MinGW/bin-Ordner ab.
  3. Laden Sie die Entwicklungspakete für die Bibliotheken von Drittanbietern herunter, und zeigen Sie eine Umgebungsvariable auf diesen Speicherort.
  4. Erstellen Sie das Projekt mit den üblichen qmake/make-Befehlen.

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

+0

Ich versuche gerade das Visual Studio Plugin für QT auszuprobieren um QT-Apps zu erstellen und den VS-Compiler zu verwenden (und meine MSVC-.libs zu verwenden) –

Verwandte Themen