Hallo, ich habe eine QT Anwendung geschrieben. Wenn ich vom Designer aus starte, ist alles OK. Wenn ich das Release build ausserhalb starten möchte, gibt es Fehlermeldungen, QT Corelib.dll und irgendeine MinGw DLL nicht gefunden. Wie kann ich das vermeiden? Ich möchte eine exe haben, die nach Möglichkeit auf jedem PC läuft- also unter Windows zumindest. ps. in der Projektdatei habe ich schon config+=static versucht, jedoch keine Änderung erreicht. Vorab Vielen Dank! Grüße Michael
Du musst die DLLs in das passende Verzeichnis packen. "C:/WINDOWS/system32" oder so. Michael schrieb: > ps. in der Projektdatei habe ich schon config+=static versucht, jedoch > keine Änderung erreicht. http://www.qtnode.net/wiki/Building_static Ob das noch aktuell ist, weiß ich nicht. Statisch ist aber nicht so toll, dann lieber so: http://www.qtnode.net/wiki/Distributing_Win32_Qt_applications oder einem anderen Installer halt.
... ... ... schrieb: > Statisch ist aber nicht so toll Warum? Statisches Linken erzeugt zwar größere Exe-Files, aber macht Installationsprogramme und das herumschleppen irgendwelcher DLLs entbehrlich. Wobei bei intelligentem Aufbau der statischen Libraries das statisch gelinkte Resultat durchaus deutlich kleiner sein kann als die Summe aus dynamisch gelinktem Exe-File und erforderlicher DLLs. Welche realen Nachteile siehst Du bei statisch gelinkten Exe-Files?
Hallo und vielen Dank erstmal. Da ich nur kleine Tools erstelle, ist es viel einfacher, wenn ich diese ohne Installer etc. weitergeben kann. Es wäre schön, wenn jemand einen Weg aufzeigen könnte, wie das unter QT geht. Vielen Dank! Grüße Michael
Rufus t. Firefly schrieb: > Welche realen Nachteile siehst Du bei statisch gelinkten Exe-Files? Pauschal die Größe, ist hier aber anscheinend nicht so wichtig. Hier, dass er erstmal Qt neukompilieren muss. Ob sich der Aufwand lohnt, muss er natürlich selbst entscheiden. Michael schrieb: > Es wäre schön, wenn jemand einen Weg aufzeigen könnte, wie das unter QT > geht. Funktioniert mein Link von oben nicht? Ansonsten, hier ist noch einer: http://doc.qt.nokia.com/4.6/deployment-windows.html
Rufus t. Firefly schrieb: > Welche realen Nachteile siehst Du bei statisch gelinkten Exe-Files? Ist nur für Open-Source Anwendungen zulässig. Kommerzielle Software muss entweder mit der Kauf-Version der QT erstellt sein, oder dynamisch gegen die LGPL-QT-DLLs gelinkt werden, damit der End-User die Möglichkeit behält die QT selbst zu ändern und eine angepasste Version zu verwenden...
Solltest du keine Lust auf ein Neukompilieren von Qt haben und eine einfache KOSTENFREIE Möglichkeit eines Installers suchst kann ich dir InnoSetup empfehlen!
Nullsoft (die Leute hinter Winamp) stellen mit NSIS ebenfalls einen kostenfreien Installer zur Verfügung: http://nsis.sourceforge.net/Main_Page Aber einen Installer benötigt man eben nicht, wenn man statisch linkt. Und die Qt-Libraries in der statischen Version zu erzeugen sollte keine Raketenwissenschaft sein.
Rufus t. Firefly schrieb: > Aber einen Installer benötigt man eben nicht, wenn man statisch linkt. > Und die Qt-Libraries in der statischen Version zu erzeugen sollte keine > Raketenwissenschaft sein. Die Neu-Kompiliererei nervt aber schon sehr, weil sie doch recht lange dauert. Überhaupt habe ich nie verstanden, warum man Qt nach dem Installieren erst noch übersetzen muss - wenn ich mir ein Java SDK installiere, dann läuft das einfach.
Mark Brandis schrieb: > Die Neu-Kompiliererei nervt aber schon sehr, weil sie doch recht lange > dauert. Muss man einmal machen. Mark Brandis schrieb: > Überhaupt habe ich nie verstanden, warum man Qt nach dem > Installieren erst noch übersetzen muss Es wird halt ohne fertig compilierte Libraries ausgeliefert, die nämlich sind compilerspezifisch. Also müssten entweder für verschiedene verbreitete Compiler und Betriebssysteme unterschiedliche Auslieferungspakete für Qt existieren oder aber das Auslieferungspaket wird riesig. Also wird der Sourcecode ausgeliefert, und den übersetzt man einmal in allen benötigten Varianten mit seinem eigenen Compiler. > - wenn ich mir ein Java SDK installiere, dann läuft das einfach. Da wird ja auch nichts übersetzt, aber ohne JRE läuft da gar nichts.
Rufus t. Firefly schrieb: > Mark Brandis schrieb: >> Die Neu-Kompiliererei nervt aber schon sehr, weil sie doch recht lange >> dauert. > > Muss man einmal machen. Zweimal, wenn man dynamisch und statisch linken können will ;-) > Also müssten entweder für verschiedene > verbreitete Compiler und Betriebssysteme unterschiedliche > Auslieferungspakete für Qt existieren oder aber das Auslieferungspaket > wird riesig. Unterschiedliche Auslieferungspakete für die Betriebssysteme gibt es ja sowieso schon. Was man machen könnte ist, den jeweils am weitesten verbreiteten Compiler je Plattform als Standard anzunehmen und das Package dementsprechend auszuliefern, und wer einen anderen als diesen Compiler verwendet, der muss dann eben neu übersetzen.
Hallo, ich habe nach den Anleitungen gearbeitet configure -static mingw32-make und nun folgendes Problem: Beim Make gibt es viele Fehlermeldungen: undefined reference to und dann Qassert... QBytearray... und und und. Make endet mit einem Fehler. Kann mir jemand helfen? QT Designer kann auch nichts mehr erstellen. Fehlermeldung moc_mainwondow.cpp und nichts weiter. Gruß Michael
Hast Du in der Umgebungsvariablen PATH die entsprechenden Pfade eingetragen? Bei mir z.B. D:\Programme\MinGW\bin;D:\Programme\Qt\2010.02.1\bin;D:\Programme\Qt\201 0.02.1\qt\bin
wobei zwei DLL Dateien mit in den exe Ordner zu legen jetzt doch auch nicht das Problem sein dürfte oder ;-) ...
Kixx schrieb: > wobei zwei DLL Dateien mit in den exe Ordner zu legen jetzt doch auch > nicht das Problem sein dürfte oder ;-) ... Hallo, ja es stimmt. Im Grunde kein Problem, wenn man es weiter gibt gibt es Probleme. Aber ich kann ja das Release nicht mal auf meinem PC starten. Fehlermeldung: "Der Prozedureinsprung "_Z5qFreePv" wurde in der DLL "QtCore4.dll" nicht gefunden. Ich habe einen Dependency Walker laufen lassen. 2 DLL's kann ich nirgens auf meinem System finden: Wer.DLL und IESHIMS.DLL Hat jemand einen Tipp? Ach ja den Versuch mit cofing static habe ich durch Neuinstallation wieder rückgängig gemacht. Grüße Michael
Hallo Michael, hab den Release Ordner bei weitergabe immer komplett weitergegeben, das hat bis dato noch keine Prob's gegeben. Wobei ich dazu anmerken muss, das ich auch immer die Anwendung auf das Zielsystem kopiert habe. Das mit dem Einsprungspunkt klingt ein wenig da nach das die Qt*.dll mit nem anderem Kompiler übersetzt wurde als dein Programm ? eventuell opensource qt und windows kompiler Prog. übersetzt ? Gruß Kixx
Neugierige Frage: Wozu braucht man eigentlich Qt unter Windows, wenn man nur "kleine Tools" entwickelt ? Das soll jetzt keine Kritik sein, ich hab nie mit Qt zu tun gehabt.
Hallo Kixx, so tief stecke ich da nicht drin. Ich habe lediglich QT installiert- wohlgemerk unter Windows. Unter QT kann ich das Programm starten. Wenn ich ein Release erstelle und es vom Explorer aus ausführen möchte, kommt erst die Frage nach den DLL's. Die habe ich dann in den Ordner kopiert (Aus den QT Ordnern heraus). Und es lässt sich nicht starten. Michael
@ich QT ist halt ne andere Klassensammlung als z.B. die MFC von MS der Vorteil ist (wenn mann sich an die reinen QT Klassen hält) das die Programme ebenso für andere BS z.B. Linux leicht zu übersetzen sind, da es hier die QT Lib ebenfalls gibt. @Michael (sind nur Fragen über die ich auch schon gestolpert bin) - 1. es gibt ne unterschied zwischen QT Debug *.dll und QT Release.dll's erkennbar an dem zusätzlichen d vor der 4 im Namen z.B. QtSql4.dll und QtSqld4.dll - 2 ist die Release Version auch wirlich eine (Projekte -> Build - Einstellungen -> auf Release schalten steht bei qmake am Ende config+=release) - 3 mal unter erstellen auf alles bereinigen und anschließend qmake ausführen und nochmal neu übersetzen (wirkt manchmal Wunder)
Hallo Kixx, vielen Dank!. allerdings ist es ohne Änderung. die config ist release. Die DLL's habe ich aus qt/bin kopiert. Die Fehlermeldung ist wie oben. Muss ich im Projekt noch was einbinden? Michael
;-( jetzt wird's langsam dünner ... liegt vielleicht noch ne "alte" QtCore4.dll von den vorhergehenden Versuchen im Win32 Ordner vom Windows ?
Wenn du mal spaßenshalber ein neues Projekt Qt GUI Projekt erstellst (Mit dem Assi unter Datei -> Neues Projekt )und in dieses nichts weiter einfügst, muss nur die QtCore4.dll und noch die QtGui4.dll (glaub ich) mit in den Release Ordner und das Ding muss starten. (Nach nem Übersetzungslauf versteht sich...) Geht das ?
Hallo Kixx, Nein das ging nicht. Aber das mit den DLL Versionen war der richtige Weg. Ich habe die core und die gui dll in 2 Versionen. unter qt\2010.04\bin liegt die Dateiversion 4.7.0.0 unter qt\2010.04\qt\bin liegt die Version 4.6.3.0. Wenn ich die neuere benutze (IM Release Verzeichnis), gibt es die Fehlermeldung. Mit der alten Version läuft es, auch meine ursprüngliche Anwendung. Mark Brandis schrieb: > Hast Du in der Umgebungsvariablen PATH die entsprechenden Pfade > eingetragen? Bei mir z.B. > > D:\Programme\MinGW\bin;D:\Programme\Qt\2010.02.1\bin;D:\Programme\Qt\201 0.02.1\qt\bin Hallo Mark, ja die habe ich in PATH aufgenommen. Das Resultat bleibt gleich. Michael
=============================================== MinGW =============================================== -> MinGW-5.1.4.exe ausführen -> unter Choose Components: MinGW base Tools; G++ compiler; MinGW make -> Installation abschließen Umgebungsvariable setzen: -> Arbeitsplatz->Systemeigenschaften->Erweitert->Umgebungsvariablen -> Suchen nach Path -> Bearbeiten -> Im Feld "Wert der Variablen" am Ende Folgendes hinzufügen: C:\MinGW\bin =============================================== QT - MINGW =============================================== -> qt-sdk-win-opensource-2009.03.exe ausführen -> MinGW Installation: Find MinGW -> C:\MinGw Umgebungsvariablen setzen: Hinzufügen zu Path: C:\Qt\2009.03\qt\bin Umgebugsvariablen hinzufügen: QTDIR = C:\Qt\2009.03 QTMAKESPEC = win32-g++ =============================================== Statisches Linken von Programmen mit Qt & MinGW =============================================== Ausführen -> cmd cd %qtdir% configure -static mingw32-make öffnen der Datei "%qtdir%\mkspecs\win32-g++\qmake.conf suchen nach Zeile "QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc" ändern in "QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc" Ausführen -> cmd configure -static -release -no-exceptions mingw32-make
Michael schrieb: > Aber das mit den DLL Versionen war der richtige > Weg. Wird so allmählich klar, warum das statische Linken doch irgendwie zu bevorzugen ist?
Rufus t. Firefly schrieb: > Michael schrieb: >> Aber das mit den DLL Versionen war der richtige >> Weg. > > Wird so allmählich klar, warum das statische Linken doch irgendwie zu > bevorzugen ist? Braucht er dann nicht trotzdem noch die mingw DLL dazu? Und zwei Files werdens trotzdem, entweder EXE+QT-DLL oder Statische EXE + Source-Code-Archiv, wenn ich den achten? Post richtig verstanden hab...
Εrnst B✶ schrieb: > Braucht er dann nicht trotzdem noch die mingw DLL dazu? Dann wäre es kein statisches Linken. Das Sourcecodearchiv ist zum Laufenlassen des Programmes natürlich nicht erforderlich, das muss nur aus lizenzrechtlichen Gründen zur Verfügung gestellt werden (was meiner Auffassung nicht impliziert, daß es prinzipiell mit jeder Auslieferungsform der Anwendung auch mitgeliefert werden muss).
Hallo, EagleUser, Danke für die ausführliche Anleitung. OK ich habe weiterhin MinGW unter qt verwendet. Die Path Einträge ergänzt, wie von dir beschrieben. Ich komme bis zum 2. make. Das wird dann mit folgenden Fehlern abgebrochen. Da fehlt noch was. Könntest Du mir sagen, was dewr Grund ist /sein könnte? Grüße Michael
@Rufus t. Firefly > Wird so allmählich klar, warum das statische Linken doch irgendwie zu > bevorzugen ist? Wie mann sieht sind beide Wege (statisch & dynamisch) nicht leicht zu beschreiten ;-) (nicht persönlich nehmen @Michael)
:
Wiederhergestellt durch Admin
Die Fehlermeldungen lassen darauf schließen, daß eine Importlibrary fehlt - das widerspricht irgendwie dem statischen Linken. Ist das ganze Projekt nach Umstellung auf statisches Linken einmal komplett neu übersetzt worden? Dann darf eigentlich nirgends ein Symbol namens _imp___xxxx verwendet werden. (Übrigens kann man den Text, der unter Windows in einem Konsolenfenster ausgegeben wird, leicht in die Zwischenablage kopieren, dafür braucht es keinen Screenshot ... Rechtklick in das Konsolenfenster und "Markieren" aufrufen, oder, wenn der Quickedit-Modus aktiv ist, mit gedrückter linker Maustaste den gewünschten Bereich markieren und mit der Return-Taste in die Zwischenablage kopieren)
Rufus t. Firefly schrieb: > Die Fehlermeldungen lassen darauf schließen, daß eine Importlibrary > fehlt - das widerspricht irgendwie dem statischen Linken. > Ist das ganze Projekt nach Umstellung auf statisches Linken einmal > komplett neu übersetzt worden? > > Dann darf eigentlich nirgends ein Symbol namens _imp___xxxx verwendet > werden. Hallo, das Problem tritt auf, wenn QT mit -static erstellt wird. Grüße Michael
Und das eigentliche Programm? Das muss natürlich auch dazu gebracht werden, die statischen QT-libs zu verwenden.
Ja richtig. Aber erst mal muss QT mit -static erstellt werden und daran hängt es noch. Michael
Hallo noch mal, nun komme ich mit mingw32-make nicht mehr so weit. Configure-static ist ohne Probleme durchgelaufen. make endet mit: release/main.o:main.cpp:(.text+0x1498): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x14ff): undefined reference to `QByteArray::oper ator=(char const*)' release/main.o:main.cpp:(.text+0x1561): undefined reference to `QByteArray::star tsWith(char) const' release/main.o:main.cpp:(.text+0x15b1): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x15e2): undefined reference to `QByteArray::remo ve(int, int)' release/main.o:main.cpp:(.text+0x160a): undefined reference to `QString::fromLat in1(char const*, int)' release/main.o:main.cpp:(.text+0x1620): undefined reference to `QFile::QFile(QSt ring const&)' release/main.o:main.cpp:(.text+0x1648): undefined reference to `QFile::open(QFla gs<QIODevice::OpenModeFlag>)' release/main.o:main.cpp:(.text+0x1680): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x1778): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x1810): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x184c): undefined reference to `QFile::atEnd() c onst' release/main.o:main.cpp:(.text+0x1870): undefined reference to `QIODevice::readL ine(long long)' release/main.o:main.cpp:(.text+0x1880): undefined reference to `QByteArray::trim med() const' release/main.o:main.cpp:(.text+0x18da): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x193b): undefined reference to `QVectorData::gro w(int, int, int, bool)' release/main.o:main.cpp:(.text+0x19bc): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x19c9): undefined reference to `QFile::~QFile()' release/main.o:main.cpp:(.text+0x19fa): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1a53): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x1a63): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1a73): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1ad5): undefined reference to `QString::free(QS tring::Data*)' release/main.o:main.cpp:(.text+0x1b3d): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x1b94): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x1c22): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x1c76): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1ce1): undefined reference to `qstrcmp(QByteArr ay const&, char const*)' release/main.o:main.cpp:(.text+0x1d0c): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1d1f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1e70): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x1eee): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1f34): undefined reference to `qstrcmp(QByteArr ay const&, char const*)' release/main.o:main.cpp:(.text+0x1f5e): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x1f73): undefined reference to `QMapData::contin ueFreeData(int)' release/main.o:main.cpp:(.text+0x202d): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x20f8): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x2135): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x219b): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x21de): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x21f6): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x21fb): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x2201): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x2206): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x221f): undefined reference to `QByteArray::QByt eArray(char const*)' release/main.o:main.cpp:(.text+0x2253): undefined reference to `QByteArray::inde xOf(char, int) const' release/main.o:main.cpp:(.text+0x2279): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x2289): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x22b4): undefined reference to `QByteArray::left (int) const' release/main.o:main.cpp:(.text+0x22c4): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x22ea): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x22ef): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x22f5): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x22fa): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x23ca): undefined reference to `QHashData::detac h_helper2(void (*)(QHashData::Node*, void*), void (*)(QHashData::Node*), int, in t)' release/main.o:main.cpp:(.text+0x249f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x24c0): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x24c5): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x24cb): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x24d0): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x24e9): undefined reference to `QByteArray::shar ed_null' release/main.o:main.cpp:(.text+0x2574): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x25cd): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x2636): undefined reference to `QListData::detac h3()' release/main.o:main.cpp:(.text+0x26c8): undefined reference to `QListData::appen d()' release/main.o:main.cpp:(.text+0x2716): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x276f): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x27d8): undefined reference to `QListData::detac h3()' release/main.o:main.cpp:(.text+0x286a): undefined reference to `QListData::appen d()' release/main.o:main.cpp:(.text+0x28b8): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x28e2): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x2924): undefined reference to `QListData::detac h3()' release/main.o:main.cpp:(.text+0x29b2): undefined reference to `QListData::appen d()' release/main.o:main.cpp:(.text+0x2a0b): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2a40): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2ae3): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x2c00): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x2c94): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2ca9): undefined reference to `QMapData::contin ueFreeData(int)' release/main.o:main.cpp:(.text+0x2d44): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2d5b): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2d9d): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2e20): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x2e59): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x2ed2): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x2f02): undefined reference to `QHashData::alloc ateNode(int)' release/main.o:main.cpp:(.text+0x2f99): undefined reference to `QHashData::rehas h(int)' release/main.o:main.cpp:(.text+0x3032): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x3042): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x305f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x306f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x30ab): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x3103): undefined reference to `QListData::detac h3()' release/main.o:main.cpp:(.text+0x3195): undefined reference to `QListData::appen d()' release/main.o:main.cpp:(.text+0x31dc): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x323a): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x32a3): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x32bb): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x32c0): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x32c6): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x32cb): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x32ea): undefined reference to `QHashData::alloc ateNode(int)' release/main.o:main.cpp:(.text+0x33ac): undefined reference to `QHashData::rehas h(int)' release/main.o:main.cpp:(.text+0x33ff): undefined reference to `QFile::~QFile()' release/main.o:main.cpp:(.text+0x344e): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x3484): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x34a3): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x34a8): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x34ae): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x34b3): undefined reference to `QVectorData::sha red_null' release/main.o:main.cpp:(.text+0x34d2): undefined reference to `QHashData::alloc ateNode(int)' release/main.o:main.cpp:(.text+0x3580): undefined reference to `QHashData::rehas h(int)' release/main.o:main.cpp:(.text+0x35ba): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3615): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x3628): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x3648): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x36a1): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x36f8): undefined reference to `QByteArray::last IndexOf(char, int) const' release/main.o:main.cpp:(.text+0x3756): undefined reference to `QDir::separator( )' release/main.o:main.cpp:(.text+0x37ad): undefined reference to `QByteArray::oper ator=(char const*)' release/main.o:main.cpp:(.text+0x38d5): undefined reference to `QByteArray::real loc(int)' release/main.o:main.cpp:(.text+0x3913): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x39b0): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x39c9): undefined reference to `QByteArray::real loc(int)' release/main.o:main.cpp:(.text+0x3b27): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3b6c): undefined reference to `qstrcmp(QByteArr ay const&, char const*)' release/main.o:main.cpp:(.text+0x3bc6): undefined reference to `qstrcmp(QByteArr ay const&, char const*)' release/main.o:main.cpp:(.text+0x3c0b): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x3c18): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x3c35): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3c8f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3cc0): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3cde): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3cee): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3d28): more undefined references to `qFree(void *)' follow release/main.o:main.cpp:(.text+0x3d65): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x3d8c): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3ddb): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x3e18): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x3e3f): undefined reference to `QHashData::free_ helper(void (*)(QHashData::Node*))' release/main.o:main.cpp:(.text+0x3e64): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3ee8): undefined reference to `qt_assert_x(char const*, char const*, char const*, int)' release/main.o:main.cpp:(.text+0x3f2b): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x3f5e): undefined reference to `QByteArray::mid( int, int) const' release/main.o:main.cpp:(.text+0x3f6b): undefined reference to `QByteArray::oper ator=(QByteArray const&)' release/main.o:main.cpp:(.text+0x3f84): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text+0x3f94): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE4freeEPN9QListData4Dat aE[QList <QString>::free(QListData::Data*)]+0x34): undefined reference to `QString::free( QString::Data*)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE4freeEPN9QListData4Dat aE[QList <QString>::free(QListData::Data*)]+0x57): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0x24): undefined reference to `QListData::detach3()' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0x81): undefined reference to `qt_assert(char const*, ch ar const*, int)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0xc6): undefined reference to `QListData::append()' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0xf3): undefined reference to `QString::free(QString::Da ta*)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0x117): undefined reference to `qt_assert(char const*, c har const*, int)' release/main.o:main.cpp:(.text$_ZN5QListI7QStringE6appendERKS0_[QList<QS tring>:: append(QString const&)]+0x138): undefined reference to `qt_assert(char const*, c har const*, int)' release/main.o:main.cpp:(.text$_ZN5QListIN12Preprocessor11IncludePathEE4 freeEPN9 QListData4DataE[QList<Preprocessor::IncludePath>::free(QListData::Data*) ]+0x42): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN5QListIN12Preprocessor11IncludePathEE4 freeEPN9 QListData4DataE[QList<Preprocessor::IncludePath>::free(QListData::Data*) ]+0x6f): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN4QMapI10QByteArrayS0_ED1Ev[QMap<QByteA rray, QB yteArray>::~QMap()]+0x34): undefined reference to `QMapData::continueFreeData(in t)' release/main.o:main.cpp:(.text$_ZN4QMapI10QByteArrayS0_ED1Ev[QMap<QByteA rray, QB yteArray>::~QMap()]+0x5a): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN4QMapI10QByteArrayS0_ED1Ev[QMap<QByteA rray, QB yteArray>::~QMap()]+0x70): undefined reference to `qFree(void*)' release/main.o:main.cpp:(.text$_ZN5QListI8ClassDefED1Ev[QList<ClassDef>: :~QList( )]+0x6d): undefined reference to `qFree(void*)' collect2: ld returned 1 exit status mingw32-make[2]: *** [..\..\..\bin\moc.exe] Error 1 mingw32-make[2]: Leaving directory `C:/Qt/2010.04/qt/src/tools/moc' mingw32-make[1]: *** [release] Error 2 mingw32-make[1]: Leaving directory `C:/Qt/2010.04/qt/src/tools/moc' mingw32-make: *** [sub-moc-make_default-ordered] Error 2 C:\Qt\2010.04\qt> ich glaube da fehlen Sachen aus der Corelib. Wie geht das zu fixen? Michael
Rufus t. Firefly schrieb: > Εrnst B✶ schrieb: >> Braucht er dann nicht trotzdem noch die mingw DLL dazu? > > Dann wäre es kein statisches Linken. Man kann auch an Qt statisch und an mingw dynamisch linken. Wenn man alles statisch will, wird man sich auch mingw selbst übersetzen müssen, da es davon meines Wissens keine schon fertige statische Version gibt. > Das Sourcecodearchiv ist zum Laufenlassen des Programmes natürlich > nicht erforderlich, das muss nur aus lizenzrechtlichen Gründen zur > Verfügung gestellt werden Nicht bei Qt ab Version 4.5, da das unter LGPL steht. Da muß man vom eigenen Programm keinen Quellcode veröffentlichen, egal ob man statisch oder dynamisch linkt. Nur wenn man an Qt selbst was ändert, muß man diese Änderungen als Quellcode verfügbar machen. Qt-Versionen vor 4.5 waren nur unter GPL und QPL verfügbar. Da stand das gesamte Programm unter GPL und der Quellcode mußte auch veröffentlicht werden, wenn man nicht die kommerzielle Version von Qt gekauft hat. > (was meiner Auffassung nicht impliziert, daß es prinzipiell mit jeder > Auslieferungsform der Anwendung auch mitgeliefert werden muss). Muß es nicht. Es reicht z.B. auch aus, den Quellcode auf Anfrage zum Selbstkostenpreis auf einem Datenträger zu verschicken. Da gibt es auch nicht viel aufzufassen, weil das praktisch wörtlich so in der GPL steht.
Rolf Magnus schrieb: > Nicht bei Qt ab Version 4.5, da das unter LGPL steht. Da muß man vom > eigenen Programm keinen Quellcode veröffentlichen, egal ob man statisch > oder dynamisch linkt. Doch. Genau das ist der Sinn der LGPL. Dynamisch Linken oder Source (*). Hier nochmal zum Nachlesen: http://qt.nokia.com/about/licensing/frequently-asked-questions/ Zitat:
1 | ... In essence this means that Qt users may create |
2 | proprietary applications that dynamically link to |
3 | the LGPL-licensed Qt libraries ... |
und
1 | ... The LGPL carries some restrictions regarding the ability |
2 | for users to relink libraries... |
*) Muss deswegen nicht OpenSource werden. ggfs. reicht es auch, Statt den Quellen nur die zwischen-Object-Files rauszugeben. Wichtig ist halt nur dass der Endanwender eine andere QT-Version mit deiner App zusammen verwenden kann, als die mit der ursprünglich gelinkt wurde.
Εrnst B✶ schrieb: > *) Muss deswegen nicht OpenSource werden. ggfs. reicht es auch, Statt > den Quellen nur die zwischen-Object-Files rauszugeben. Wichtig ist halt > nur dass der Endanwender eine andere QT-Version mit deiner App zusammen > verwenden kann, als die mit der ursprünglich gelinkt wurde. Allerdings. Wobei ich auf http://www.gnu.de/documents/lgpl-2.1.de.html auch noch folgenden skurrilen Satz gefunden habe:
1 | Als Ausnahme von den Bestimmungen der vorstehenden fünf Paragraphen |
2 | dürfen Sie auch ein „Werk, das die Bibliothek nutzt“, mit der Bibliothek |
3 | kombinieren oder linken, um ein Werk zu erzeugen, das Teile der |
4 | Bibliothek enthält, und dieses unter Bedingungen ihrer eigenen Wahl |
5 | weitergeben, sofern diese Bedingungen Bearbeitungen für den eigenen |
6 | Gebrauch des Empfängers und ein Rückbilden (“reverse engineering”) zum |
7 | Beheben von Mängeln solcher Bearbeitungen gestatten. |
Nun gestattet ja an sich jedes Programm ein Reengineering, in der Regel allerdings mit einem nicht unerheblichen Aufwand.
Ich habe mich da evtl. nicht ganz klar ausgedrückt: Der zitierte Satz sagt meinem Verständnis nach aus, daß man ein Programm auch komplett fertig statisch an eine LGPL-Bibliothek gelinkt closed-source vertreiben darf, wenn man in seinen Lizenzbedingungen ein Re-Engineering erlaubt. Dabei scheint es egal zu sein, wie schwierig ein solche Re-Engineering dann tatsächlich wäre.
Rolf Magnus schrieb: > Dabei scheint es egal zu sein, wie schwierig ein > solche Re-Engineering dann tatsächlich wäre. Gilt da nicht noch zusätzlich der zweite Abschnitt in §6? Also auf die Lib hinweisen, auf die LGPL hinweisen, Copyright-Vermerk ... und dann 1-aus-5 auswählen, u.A.
1 | dann liefern Sie es zusammen mit dem vollständigen maschinenlesbaren |
2 | „Werk, das die Bibliothek nutzt“, in Form von Objektcode und/oder |
3 | Quelltext, so daß der Benutzer die Bibliothek verändern und dann erneut |
4 | linken kann, um ein verändertes ausführbares Programm zu erzeugen, |
5 | das die veränderte Bibliothek enthält. |
oder
1 | Benutzen Sie einen geeigneten „shared-library-Mechanismus“ zum |
2 | Linken mit der Bibliothek. |
Εrnst B✶ schrieb: > Rolf Magnus schrieb: >> Dabei scheint es egal zu sein, wie schwierig ein >> solche Re-Engineering dann tatsächlich wäre. > > Gilt da nicht noch zusätzlich der zweite Abschnitt in §6? Ja, stimmt. Was das mit dem Re-Engineering dann soll, verstehe ich aber nicht. Wenn man die Bibliothek als Quelltext hat und dazu die Object-Files oder den Quelltext des Programms, was muß man dann noch re-engineeren, um die Bibliothek zu ändern?
Rolf Magnus schrieb: > Wenn man die Bibliothek als Quelltext hat und dazu die > Object-Files oder den Quelltext des Programms, was muß man dann noch > re-engineeren, um die Bibliothek zu ändern? Vielleicht für den Fall "Binary .EXE + LGPL-Library als DLL": Um eine geänderte DLL-Version mit geänderten Interfaces zum laufen zu kriegen, oder auch nur einen DLL-Versionscheck in der EXE abzuschalten, muss man halt das EXE zerpflücken dürfen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.