Statisch kompilieren spuckt Linker-Fehler aus

Verschiedenes zu Qt
Antworten
Johannes
Beiträge: 9
Registriert: 29. Mai 2006 09:33
Kontaktdaten:

Statisch kompilieren spuckt Linker-Fehler aus

Beitrag von Johannes »

Hallo zusammen,

Ich habe ein Tool erstellt, welches ich nun statisch kompilieren muss, um es auch auf Rechnern lauffähig zu bekommen, welche weder Qt- noch sonstige DLLs von Entwicklungsumgebungen (msvcrt.dll, ...), auf der Platte haben. Die DLLs sollen nicht mitgeliefert werden, da das Programm ohne Installation und ohne Kopieren einer großen Anzahl von Dateien laufen soll.

Nun habe ich sowohl im VS2003 als auch mal manuell über editieren des Makefiles, versucht, statisch zu kompilieren. Da es sich bei der Anwendung um ein Tool mit Multithreading handelt, habe ich folgende Einstellungen gewählt:
- Release-Mode
- RunTime-Library ist Multithreaded (/MT) ohne DLL
- der Linker ignoriert die Bibliotheken libc.lib und msvcrt.lib, da diese sonst mit den Multithreaded-Libraries im Konflikt stehen.

Nun erhalte ich massig Meldungen vom Linker - sowohl Warnungen als auch Fehler. Hier ein Auszug:

Code: Alles auswählen

[...]
qt-mt.lib(qfile_win.obj) : warning LNK4217: Lokal definiertes Symbol __errno, importiert in Funktion "public: virtual void __thiscall QFile::close(void)" (?close@QFile@@UAEXXZ)
qt-mt.lib(qtextstream.obj) : warning LNK4217: Lokal definiertes Symbol _isxdigit, importiert in Funktion "private: unsigned long __thiscall QTextStream::input_hex(void)" (?input_hex@QTextStream@@AAEKXZ)
qt-mt.lib(pngread.obj) : warning LNK4217: Lokal definiertes Symbol _abort, importiert in Funktion _png_create_read_struct_2
qt-mt.lib(pngwrite.obj) : warning LNK4217: Lokal definiertes Symbol _abort, importiert in Funktion _png_write_info_before_PLTE
qt-mt.lib(qobject.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__imp__strstr', verwiesen in Funktion '"void __cdecl err_info_about_candidates(int,class QMetaObject const *,char const *,char const *)" (?err_info_about_candidates@@YAXHPBVQMetaObject@@PBD1@Z)'
qt-mt.lib(qconnection.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __imp__strstr
qt-mt.lib(qimage.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __imp__strstr
qt-mt.lib(qthread_win.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__imp___endthreadex', verwiesen in Funktion '"public: static void __cdecl QThread::exit(void)" (?exit@QThread@@SAXXZ)'
qt-mt.lib(qthread_win.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__imp___beginthreadex', verwiesen in Funktion '"public: void __thiscall QThread::start(enum QThread::Priority)" (?start@QThread@@QAEXW4Priority@1@@Z)'
qt-mt.lib(qapplication_win.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__imp__strrchr', verwiesen in Funktion '"void __cdecl set_winapp_name(void)" (?set_winapp_name@@YAXXZ)'
qt-mt.lib(qapplication_win.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '__imp__toupper', verwiesen in Funktion '"int __cdecl asciiToKeycode(char,int)" (?asciiToKeycode@@YAHDH@Z)'
qt-mt.lib(qcstring.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __imp__toupper
qt-mt.lib(qfileinfo_win.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __imp__toupper
qt-mt.lib(qimage.obj) : error LNK2001: Nichtaufgelöstes externes Symbol __imp__toupper
[...]
Vielleicht ist es nur eine Kleinigkeit. Aber im Moment komme ich einfach nicht dahinter.

Vielen Dank schonmal im Voraus!

Viele Grüße

JOHANNES
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich gehe mal davon aus das Du Qt statisch kompiliert hast. Dann hast Du nicht geschrieben welche Qt Version Du nutzt. qt-mt.lib ist nämlich Qt3, toupper ist mir da aber nicht bekannt. Bei Qt4 gibt es QString::toUpper(), aber eben mit großem U.
Johannes
Beiträge: 9
Registriert: 29. Mai 2006 09:33
Kontaktdaten:

Beitrag von Johannes »

Ja, sorry, hab ich vergessen.

Ich verwende Qt 3.3.5 commercial - statisch kompiliert.

Nunja, wenn es das in Qt3 nicht gibt, warum konnte ich es dann dynamisch problemlos kompilieren?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

macman hat geschrieben:Ich gehe mal davon aus das Du Qt statisch kompiliert hast. Dann hast Du nicht geschrieben welche Qt Version Du nutzt. qt-mt.lib ist nämlich Qt3, toupper ist mir da aber nicht bekannt. Bei Qt4 gibt es QString::toUpper(), aber eben mit großem U.
Du hast falsch geschaut - toupper ist eine c-Funktion (sieht man auch an den Imports)

Irgendwie kommt es mir vor als wäre nicht alles neu kompiliert worden (bei den doppelten imports) und als würde eine lib fehlen. toupper ist angeblich in allen runtime-libs - also auch libcmt.lib (/MT).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Johannes
Beiträge: 9
Registriert: 29. Mai 2006 09:33
Kontaktdaten:

Beitrag von Johannes »

Ich habe alle Objekt-Dateien manuell gelöscht, trotzdem das Projekt nochmal bereinigt (mit nmake clean und "Projekt bereinigen" im VS2003).
Das hat aber keinen Effekt, immer noch das gleiche Problem.

Ich werde mich nochmal intensiv darum kümmern. Wenn ich das Problem gelöst habe, werde ich die Lösung posten.
Johannes
Beiträge: 9
Registriert: 29. Mai 2006 09:33
Kontaktdaten:

Beitrag von Johannes »

<qtdir>/mkspecs/win32-msvc.net/qmake.conf:

Code: Alles auswählen

QMAKE_CFLAGS_MT         = -MD
QMAKE_CFLAGS_MT_DBG = -MDd
in

Code: Alles auswählen

QMAKE_CFLAGS_MT         = -MT
QMAKE_CFLAGS_MT_DBG = -MTd
ändern.

Qt neu kompilieren, dann sollte es gehen. (zumindest gehts bei mir jetzt)
Antworten