2009-07-16 10 views
11

Sono nuovo a Qt e ho un errore che non riesco a risolvere.Qt/mingw32 errori di riferimento non definiti ... impossibile collegare un .lib

Ho un file di libreria statica (VS2005) (.lib). E sto testando se funzionano bene con Qt. Quindi ho preso la libreria più semplice che ho. (Chiamato MessageBuffer).

Quindi ho aggiunto MessageBuffer.h allo main.cpp e aggiunto la posizione di tali file nello INCLUDEPATH dello .pro.

Fino ad allora tutto sembra a posto, posso usare la classe e Qt IDE mostrare tutti i metodi e tutto il resto. Quindi per me sembra che abbia trovato il file .h.

Ora ho aggiunto il (accumulo VS2005/Debug) MessageBuffer.lib nel .pro come questo:

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

ho anche provato la seguente:

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

Ecco il contenuto del mio file .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 

Tutti mi danno lo stesso erro rs: (e ho la stessa, anche se io non includono il .lib) Chiunque può aiutare

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' 

per favore?

+0

Potrebbe inviare il file pro che si sta utilizzando? –

+0

ha appena aggiunto il contenuto del file pro nel messaggio originale. –

+0

grazie. il file pro sembra buono. –

risposta

5

Sulla base della domanda Use libraries compiled with visual studio in an application compiled by g++ (mingw) e il forum del forum MSDN I can't mix VC & GCC non sembra che sia possibile collegare un'applicazione gcc con librerie compilate visive C++.

La soluzione sarebbe quella di ricompilare tutto con lo stesso compilatore.

+0

Questo è ciò che stavo per pubblicare, ho trovato questo: Queste librerie, come molti altri pacchetti di sviluppo di Windows precompilati come la libreria client MySQL, sono stati compilati con Ms Visual C++ (MSVC). MSVC e MinGW, abbiamo scoperto, usano convenzioni di denominazione diverse per le funzioni stdcall. MSVC li esporta come _name @ ordinal, ma MinGW li esporta come nome. Di conseguenza, la generazione MinGW ha avuto esito negativo con errori di collegamento "riferimenti non definiti" durante la chiamata alle funzioni stdcall esportate dalla libreria MSVC. –

+0

Guarda qui per le soluzioni: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/ –

0

Suppongo che tu abbia utilizzato la libreria MessageBuffer in un'altra applicazione con problemi. Sembra che l'errore non riesca a trovare la libreria o che la classe MessageBuffer non venga esportata.

Hai provato a mettere -l davanti alla libreria nel file pro?

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

Vedere il mio altro answer. Ho aggiunto l'altra risposta perché non volevo rendere questa risposta più disordinata di quanto non fosse già.

provato finora:

  • Non è un errore di battitura, d viene aggiunto alla libreria
  • Utilizzando l'estensione lib è corretto come si vede nella uscita
+0

d è il nome effettivo, d viene aggiunto per la versione di debug del .lib –

+0

@xcimo ha senso ... volevo solo verificare –

+0

Non so se la classe MessageBuffer viene esportata. Non ho alcuna parola chiave "export" nella classe messageBuffer, dato che sono stato in grado di usare questa libreria in molti altri progetti C++ in Visual Studio. Una libreria statica ha bisogno di un'esportazione? o forse è qualcosa che ha bisogno di me? Grazie dell'aiuto. –

4

Il MinGW FAQ discute questo problema e offre una soluzione:

  1. Creare un file di definizione utilizzando reimp (per i file lib) o PExports (per i file DLL).
  2. Rimuovere i prefissi di sottolineatura dalle funzioni stdcall.
  3. Utilizzare dlltool per convertire la libreria MSVC in una libreria MinGW con la nuova definizione.

Che non ha funzionato. Abbiamo finalmente rimosso gli ordinali dai nomi delle funzioni, che hanno causato la compilazione. Ma il programma non verrebbe eseguito perché non riusciva a trovare le funzioni collegate nella DLL. Infine, dopo aver consultato la documentazione MSDN per i file di definizione, abbiamo modificato le istruzioni di costruzione:

  1. Creare un file di definizione utilizzando reimp.
  2. Per ogni funzione stdcall (formattata come _name @ ordinale), aggiungere un nome riga = _nome @ ordinale, consentendo a MinGW di associare la convenzione di denominazione stdcall a quella di MSVC.
  3. Utilizzare dlltool per convertire la libreria MSVC in una libreria MinGW con la nuova definizione.

Ha funzionato! Per compilare il progetto devi semplicemente:

  1. Scaricare e installare il pacchetto Qt/Windows, che include MinGW.
  2. Scaricare nuovamente e rilasciarlo nella cartella MinGW/bin.
  3. Scaricare i pacchetti di sviluppo per le librerie di terze parti e puntare una variabile di ambiente in quella posizione.
  4. Costruisci il progetto con i soliti comandi qmake/make.

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

+0

Attualmente sto provando il plugin di Visual Studio per QT, per provare per costruire applicazioni QT e utilizzare il compilatore VS (e usare i miei .libs MSVC) –