Seite 1 von 1

QT DLL's in Unterordner

Verfasst: 19. März 2008 15:30
von ape
Hallo,

meine .exe benötigt u.a. um auf einem nicht entwicklungs-Rechner
lauffähig zu sein:
* QtCore4.dll
* QtGui4.dll
* QtNetwork.dll
* qextserialport.dll sowie
* mingwm10.dll

Die mir bekannten Wege sind:
a) die entsprechenden Files im Windows Ordner unterbringen. Bloed da der User dafuer Admin sein muss.

b) Die Files direkt im Ordner der exe liegen lassen

c) dll's reinlinken

Existiert auch ne Möglichkeit:

d) Die benötigten DLL's innerhalb meinem Programmfolder in einen Unterordner zu legen ?
Wenn ja, wie muss ich das im .pro File vermerken ?


Gruss
ape

Verfasst: 19. März 2008 15:34
von Christian81
d) funktioniert nicht da Windows dies so nicht unterstützt. Mit Linux könnte man den LD_LIBRARY_PATH verbiegen. Was ist das Problem wenn die Dlls im gleichen Ordner wie das executable liegen? Machen doch alle Programme so.

Verfasst: 19. März 2008 15:38
von macman
Christian81 hat geschrieben:Machen doch alle Programme so.
Genau. Und deshalb findet man in manchen Ordner vor lauter dlls das Programm nicht mehr. Ich hätte es auch lieber in Unterordnern, aber das geht leider nicht. Vom Systemverzeichnis kann man nur abraten.

Verfasst: 19. März 2008 15:41
von Christian81
macman hat geschrieben: Genau. Und deshalb findet man in manchen Ordner vor lauter dlls das Programm nicht mehr.
Dafür gibts das Startmenu ;-)

Verfasst: 19. März 2008 15:42
von ape
Hallo,

also System-Verzeichnis finde ich auch aus diversne Gründen unschön.

Die DLL's im gleichen Folder abzulegen ist möglich klar, aber da stimme ich
Macman absolut zu, darunter leidet oft die Übersicht und Struktur im Programm-Verzeichnis.


Sehe ich es richtig dass ich damit auf den Weg des DLL verlinkens limitiert bin ?


bzgl Startmenü:
da ich (weitere Vorgabe) keinen installer basteln soll,
da das Programm an sich auch von CD, USB, Netzwerk o.ä ohne Install funktionsfähig sein soll, fehlt mir bis dato auch der Eintrag im Windows -Startmenü :/
Aus interesse und des lernens willens: wie kann ich das machen ? Habt ihr mir ein Stichwort zu diesme Thema ?


Gruss
ape

Verfasst: 19. März 2008 15:47
von franzf
Alternativ könnte man doch sämtliche Programmdateien (exe, dlls) in einen Unterordner packen und im Hauptverzeichnis nur ein Startscript ablegen (und evtl. README, usw). Wäre genauso übersichtlich wie nur die DLLs in ein Unterverzeichnis zu packen.

Verfasst: 19. März 2008 16:05
von ape
die Idee klingt komisch im ersten Moment, aber da ist was dran.

Danke

Gruss
ape

Verfasst: 20. März 2008 13:37
von RHBaum
windows versucht dll's ohne komplette pfadangabe nach folgender Reihenfolge zu finden

- selbes verzeichniss wie exe
- was in den System verzeichnissen liegt (system system32)
- alle was in der PATH enviroment variable gesetzt ist .... (kann ueber registry abgeschalten werden)

Mannuelles laden mit pfadangaben faellt bei der qt raus, weil die dlls durch ne lib geladen werden ... die sicher ned ueberschreiben willst

Also bleibt Tor 3 ueber .... und hoffen das die user die geschichte mit dem Pfad ned abgschalten haben ....
du willst die pfadangabe ausserdem nicht jedesmal von Hand anpassen

Dann hasst nur noch das Problem, dass du vor dem aufruf von loadlibrary aus den QT .libs kommen musst. Wenn du davor kommst, kannst den PATH um dein verzeichniss erweitern ....

Problem ist, das davorkommen und das zu dem punkt auch die QT ned verwenden duerftest (da nicht geladen) ....
Oder alternativ ne exe schreiben, die die path variable setzt und dann mit nem systemcall den prozess mit der eigentlichen Variable ueberlagert.
ne batch wuerde auch gehen faend ich aber ned wirklich elegant ....
Darfst in der ersten exe natuerlich keine dlls verwenden, was das ermitteln des pfades in denen dein executiable liegt bisserl zu ner frikelei macht. Geht aber !
Wie machst du das dann eigentlich mit der msvc runtime ? links du die immer statisch, oder verlaesst dich drauf das die user das aktuelle Pack haben ....

ich find die dll's im App verzeichniss gar ned so unelegeant.
wir schreiben eh viel plugins, die ueber nen Manager aus nem pluginverzeichniss geladen werden ... so kann man die system dlls und die plugin dlls gut auseinanderhalten :-)

Ciao ...

Verfasst: 20. März 2008 14:12
von macman
RHBaum hat geschrieben:Also bleibt Tor 3 ueber .... und hoffen das die user die geschichte mit dem Pfad ned abgschalten haben ....
Viele Überlegungen, aber Tor 3 geht nicht. Wenn der User z.B. Qt4.1 installiert hat und Du benötigst Qt4.3, dann werden im Pfad wahrscheinlich als erstes die 4.1 DLLs gefunden. Und dann suchst Du dir nen Wolf nach dem Fehler :-) Selbst schon drauf reingefallen.

Verfasst: 20. März 2008 15:26
von RHBaum
Wenn der User z.B. Qt4.1 installiert hat
was noch relativ offensichtlich ist :-)

Schlimmer ist wenn der user tools installiert hat, die dir die qt und andere dlls gleich mal ins system verzeichniss packen ^^

Ich waer fuer leosung 0 .... exe und dll gehoeren nun mal ins selbe verzeichniss, wenn wan bei dem windows suchmechanismus sichergehen will ....

Ciao ...

Verfasst: 21. März 2008 10:40
von macman
RHBaum hat geschrieben:qt und andere dlls gleich mal ins system verzeichniss packen ^^
Systemverzeichnis ist immer schlecht, weil sich unterschiedliche Installationen die DLLs gegenseitig überschreiben.
RHBaum hat geschrieben:Ich waer fuer leosung 0 .... exe und dll gehoeren nun mal ins selbe verzeichniss
Das sieht M$ auch so vor, wenn ich das richtig in Erinnerung habe.

Verfasst: 22. März 2008 11:06
von SchranZViruS
Ich würde die Programme einfach in einen Unterordner (bin) machen, in den auch die DLLs kommen und im Hauptverzeichnis n Link reinsetzen... falls du dann noch Startmenüeinträge machen willst musst du die glaub ich direkt mit der exe verlinken, weil ich nicht weiß ob link -> link -> exe geht... (ich bezweifle es)

Des weiteren würde ich dir raten, falls du keine exceptions benutzt, die mingwm10.dll zur compile zeit raus zu feuern, da das ne ünnöttige Datei ist (geht auch wenn du threads benutzt weil Qt eigentlich keine eceptions benutzt):

in der benötigten mkspecs (win32-g++):
- alle Vorkommen von -mthreads entfernen-
- ich persönlich ersetze noch -fexceptions durch -fno-exceptions

Qt konfigurieren:
./configure -fno-exceptions

danach dein Programm nochmal durch qmake jagen und neu kompilieren