Forum: PC-Programmierung QT Anwendung lauffähig machen


von Michael (Gast)


Lesenswert?

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

von ... ... ... (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

... ... ... 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?

von Michael (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

ups habs gerade geblickt und probiere es aus

sorry
Michael

von ... ... ... (Gast)


Lesenswert?

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

von ... ... ... (Gast)


Lesenswert?

Michael schrieb:
> ups habs gerade geblickt und probiere es aus
Ah, okay. ;-)

von Devils Advocate (Gast)


Lesenswert?

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...

von EagleUser (Gast)


Lesenswert?

Solltest du keine Lust auf ein Neukompilieren von Qt haben und eine 
einfache KOSTENFREIE Möglichkeit eines Installers suchst kann ich dir 
InnoSetup empfehlen!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

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

von Kixx (Gast)


Lesenswert?

wobei zwei DLL Dateien mit in den exe Ordner zu legen jetzt doch auch 
nicht das Problem sein dürfte oder ;-) ...

von Michael (Gast)


Lesenswert?

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

von Kixx (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Kixx (Gast)


Lesenswert?

@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)

von Kixx (Gast)


Lesenswert?

...ach ja der Quellordner der dll's sollte Qt\bin sein

von Michael (Gast)


Lesenswert?

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

von Kixx (Gast)


Lesenswert?

;-( jetzt wird's langsam dünner ...

liegt vielleicht noch ne "alte" QtCore4.dll von den vorhergehenden
Versuchen im Win32 Ordner vom Windows ?

von Kixx (Gast)


Lesenswert?

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 ?

von Michael (Gast)


Lesenswert?

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

von EagleUser (Gast)


Lesenswert?

===============================================
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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Εrnst B. (ernst)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ε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).

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

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

von Kixx (Gast)


Lesenswert?

@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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Michael (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und das eigentliche Programm? Das muss natürlich auch dazu gebracht 
werden, die statischen QT-libs zu verwenden.

von Michael (Gast)


Lesenswert?

Ja richtig. Aber erst mal muss QT mit -static erstellt werden und daran 
hängt es noch.

Michael

von Michael (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

Ε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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

Ε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?

von Εrnst B. (ernst)


Lesenswert?

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
Noch kein Account? Hier anmelden.