Smalltalk Guten Morgen, Guten Tag, Guten Abend Kaffeeklatsch
#177001
geschrieben 02. Juni 2017 - 04:03
EXE größer. Aber dafür keine Abhängigkeiten.
Anzeige
#177002
geschrieben 02. Juni 2017 - 06:17
#177003
geschrieben 06. Juni 2017 - 17:26
Zugegeben, manchmal macht es Spaß, Kontroverses zu posten und sich dann an den wachsenden Minusen zu freuen und sich dann zu fragen, tscha mmmmh, was sagt das eigentlich über die Kollegen aus, wenn die sowas abminusen?
Aber daß es für Absoluta wie Lizenzen, die man hat oder nicht hat, auf Herausstellung dieses Umstands (bisher) fast 20 Minus kassiert, na das hatte ich dann doch nicht erwartet. Gute Nacht Deutschland. Aber wenigstens hab ich was zu lachen.
Moin.
#177004
geschrieben 06. Juni 2017 - 18:48
#177005
geschrieben 06. Juni 2017 - 20:07
- Statisches Linken wird zur Erstellzeit (on linkage) aufgelöst.
> Im Gegensatz dazu dynamisches Linken: Hier wird einfach eine Referenz eingetragen. Funktion namens X gibt es in DLL D. Fertig. Deswegen ist dynamisches Linken auch potentiell unsicher: Habe ich eine DLL D mit einer Funktion X und ich rufe mein Programm auf, dann lädt das diese DLL. Völlig egal, wie und was und wo. Nur die DLL muß den Namen haben (hier D) und die Funktion muß drin existieren (hier X) und nichts weiter. Gibt's die DLL D ohne Funktion X, heißt es "Funktion" bzw "Einstiegspunkt" nicht gefunden. Gibts DLL und Funktion, aber die Funktion hat die falsche Signatur (bzw unpassende) gibt's einfach einen Laufzeitfehler und die Anwendung steigt aus.
> Statisches Linken ermittelt ebenso die Funktionsliste. Hier reicht es aber nicht aus, die Funktionen zu referenzieren (byref) sondern ich muß sie übergeben (byvalue). Der Linker "sollte" in der Lage sein, Bezüge zur Linkzeit aufzulösen, sprich wenn ich ne Funktion F hab und die referenziert eine andere Funktion S1 (statisch verlinkt) und die wiederum will aber eine Funktion S2 haben (ebenfalls statisch), dann merkt der Linker das und bindet beide ein.
Statische Linkarchive (.a / .lib bei VS) sind auch relativ banal. Das ist einfach Objektcode in ein durchsuchbares Archiv gepackt (mit Index). Dann, wenn man sagt "jetzt erstellen", wird aus dem eigenen Code die .o / .obj - Dateien, die man selber gebaut hat, hergenommen und aus den statischen Archiven, von denen man gesagt hat, die verlinkt werden sollen, die nicht aufgelösten Referenzen zusammengesucht und diese dann ins Ergebnis reinkopiert. Es sieht dann also hinterher so aus, als ob alle Funktionen von Dir selber geschrieben wurden. Sie stecken auch alle in der ausführbaren Datei, ohne weitere Referenzen (deswegen werden sie ja so groß).
800MB... falls das nicht grad ein Beispiel war, könntest Du schauen, wie es mit Debuginformationen in der Datei aussieht. Evtl kann man die rausstrippen. Oder Du hast versehentlich die Debugkonfiguration genommen und es wurden die statischen Debuglibs genommen. Die sind dann natürlich tatsächlich irgendwann riesig.
Wenn es 800MB oder sowas trotz allem bleiben, dann schau mal, ob Du mit UPX was bügeln kannst. Das ist ein Laufzeitkompressor für ausführbare Dateien.
#177006
geschrieben 06. Juni 2017 - 20:51
Wenn ich statisch linke, packt es aber nicht die DLLs ein, die es braucht, sondern packt alles was da ist in die exe und das sind ja dann erheblich mehr weil es ja keine Möglichkeit gibt, herauszukriegen, welche DLLs gebraucht werden und welche nicht, außer mit stundenlangem probieren.
UPX habe ich schon ausprobiert. Das ist ne schöne Sache, um zu verkleinern und ich werde das auch gegebenenfalls mal nutzen, ändert aber nichts am Problem. Dann wäre der Größenunterschied zwar kleiner aber trotzdem hätte ich doch hunderte DLLs in der Exe statisch verwurstet, die ich nicht brauche.
Dieser Beitrag wurde von Holger_N bearbeitet: 06. Juni 2017 - 20:55
#177007
geschrieben 06. Juni 2017 - 21:05
DLLs = Funktionsbibliotheken. Du hast also ein Buch geschrieben mit Fußnoten und einen Index hinten. Jetzt kann man in dem Index die von Dir verwendeten Bücher finden. Dazu geht man in die Bibliothek (=> die DLL) und sucht sich die benötigten Bücher dort raus. In der Bibliothek (=> der DLL) befinden sich üblicherweise sehr viel mehr Bücher (Funktionen) als die, die Du referenziert hattest.
Das wäre dynamisch.
Statische Libraries: Du hast also ein Buch geschrieben. Aber diesmal verwendest Du keine Fußnoten, sondern Du schreibst sozusagen den ersten Teil und hinten hast Du keinen Index, sondern eine Übersicht der verwendeten Fachbegriffe.
Die sind dort hinten alle fein säuberlich erklärt. Andere Bücher brauchst Du nicht mehr.
Diese Liste mit den Fachbegriffen ist aber nicht erschöpflich. Nur die Fachbegriffe sind erklärt, die auch tatsächlich verwendet wurden.
Wie dick ist jetzt das Paket mit dem Buch?
Für (a) kommt es drauf an, wie umfangreich die Bibliothek war. Da Du genötigt bist, die gesamte Bibliothek mitzuliefern, hängt der Gesamtumfang also unmittelbar vom Umfang der Bibliothek ab. Das Buch selber ist schlank. Außerdem kannst Du optional sagen, such Dir doch selber ne Kopie der Bibliothek.
Für (b) kommt es auf den Umfang der verwendeten Funktionen an. Je mehr verwendet wurden (die Du nicht selber geschrieben hattest) desto dicker wird der Anhang und desto dicker das Buch, welches nun allein im Paket liegt.
Ergo, je mehr externe Funktionen verwendet werden, desto mehr profitiert man vom dynamischen Linken. Andersherum eher vom statischen.
Und wenn Du nicht die ganze Bibliothek mitliefern willst oder kannst, dann statisch. Ist auch zuverlässiger, weil keiner Bücher aus der Bibliothek austauschen kann, wo Du's nicht weißt. Andererseits kann so Buch 2.0 verwendet werden, wo Du nur Buch 1.0 hattest, weil Buch 2.0 noch nicht fertig war.
#177008
geschrieben 06. Juni 2017 - 22:04
Mein Medizinplaner braucht (je nach Compiler) folgende Dateien, damit es auf einem anderen Rechner funktioniert:
Die exe selbst, logisch
und dann packe ich dazu:
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
so, die sind nachvollziehbar, dann muß ich aber noch dazupacken
libgcc_s_dw_2-1.dll
libstdc++-6.dll
libwinpthread-1.dll
dann muß noch ein Ordner:
platforms
dazu, in welchem sich die:
qwindows.dll
befindet. Dann funktioniert alles, wobei man die letzten Vier nur durch Recherche und viel Probieren rauskriegt. Und je nach Umfang des Programmes kommen dann eben noch Sachen dazu. Wenn ich nun solch ein statisches Linkding bastel, dann müssen die Funktionalitäten dieser DLLs doch auch irgendwie in die Exe integriert werden. Wenn die Entwicklungsumgebung aber vorher nicht weiß, was alles reingepackt werden muß, dann muß ja alles rein, was da ist damit es funktioniert. Auch die Sachen die überhaupt nicht gebraucht werden. Denn wenn die Entwicklungsumgebung wüßte, was rein muß und was nicht, könnte die es mir ja auch bei der dynamischen Variante freundlicherweise sagen, dass ich nicht wochenlang probieren muß.
Oder ich versuche es mal so wie ich das Buchbeispiel inzwischen verstehe. Wenn ich nun aus einem Buch was ich sonst mitliefern würde, die Fachbegriffe rausschreibe und die Erklärungen für mein Buch übernehme, dann weiß ich ja, aus welchem Buch ich die abgeschrieben habe und könnte für die dynamische Version sagen »Du brauchts zusätzlich das Buch A.« Das kann die Entwicklungsumgebung im Falle der DLL aber nicht.
Dieser Beitrag wurde von Holger_N bearbeitet: 06. Juni 2017 - 22:14
#177009
geschrieben 06. Juni 2017 - 22:07
Sprich:
Machwas tu = new Machwas();
tu.Irgendwas();
Statisch wäre hingegen:
Machwas.tu();
und das ohne ein Object explizit zu erzeugen und dann über die Instanz auf die Methoden zuzugreifen....
Männers - das ist off-off-Topic :-D
Moinsen.
@R & H - Ich weiß - setzen 6, trotzdem offtopic herrschaften :-P
Dieser Beitrag wurde von der dom bearbeitet: 06. Juni 2017 - 22:08
#177010
geschrieben 06. Juni 2017 - 22:21
Das ist aber wieder was ganz Anderes. Es geht ja darum, dass man beim Kompilieren eine Exe erzeugt, die alleine funktioniert, ohne DLLs mit auszuliefern.
(Das war jetzt natürlich etwas albern formuliert. Ich weiß, dass das mit Sternchen Zeiger sind und ich weiß auch ungefähr wie die funktionieren aber ich habe noch nicht rausgekriegt, wozu die gut sind.)
Dieser Beitrag wurde von Holger_N bearbeitet: 06. Juni 2017 - 22:24
#177011
geschrieben 06. Juni 2017 - 22:32
Der Linker funktioniert so, er schaut sich den Quellcode an, und alles was nicht irgendwo erklärt (definiert) ist hält er für eine externe Funktion. Die muß dann dem Linker über die beinhaltende Bibliothek mitgegeben werden, damit er weiß, wo er suchen kann bzw muß.
Am Ende hat der Linker ein Tabelle von externen Funktionen. Das sind die, die er nicht auflösen konnte.
Dynamisch schreibt er diese Tabelle in die EXE. Da steht dann sinngemäß drin:
QShowWindow(qint) | QtGui.dll
QDrawImage(qimage) | QtRender.dll
und so weiter. Damit er das kann, wird er für jede unbekannte Funktion versuchen, die in irgendeiner der übergebenen DLLs zu entdecken. Findet er den Funktionsnamen in der DLL, wird beides in die Tabelle in der Exe geschrieben.
Wenn man jetzt die Exe ausführt, versucht er die Funktion zur Laufzeit zu holen über die zugeordnete DLL. Die muß dazu vorhanden sein.
Statisch hat der Linker dieselbe Tabelle. Aber nun schreibt er die nicht in die EXE rein, sondern er arbeitet die Tabelle höchstselber ab. Die Bibliotheken sind diesmal keine DLLs, sondern .LIBs oder .As . Programme können damit nix anfangen: Das sind reine Link Libraries.
Der Linker geht also da rein und sucht auch wieder die Funktionen zu den referenzierten Namen. Das geht diesmal über den Index in der Link Library. Hat er einen passenden Eintrag gefunden, wird der zugehörige Objektcode, der die Funktion beinhaltet, aus der Bibliothek rauskopiert und in die EXE eingefügt. Das sind natürlich mehr Daten als ein simpler Tabelleneintrag.
Sprich, statisch hast Du nur das Benötigte in der EXE. Dynamisch brauchst Du die gesamte DLL - normal läßt die sich nicht in Teile zerlegen, es sein denn natürlich, Du baust selber Funktionsbibliotheken.
Damit das klappt, muß man statische Link Libraries auch *haben*. Wenn es nichts gibt, was mir den Objektcode definiert, dann kann ich ihn auch nicht in meine EXE reintun.
Für Qt-Anwendungen ist das auch eigentlich recht oft, daß man das so macht. Eben wegen der sonst umfänglichen Abhängigkeiten.
Falls Du noch nicht hast, es gibt für Qt ein SDK was man runterladen und nehmen kann. Da steckt alles drin. Ist aber auch recht groß, wenn man alles mitnehmen will. Du müßtest bei der Auswahl nach den statischen Paketen und, wenn ich das richtig lese, nach der MinGW-Architektur schauen (VS wird dir nicht viel nützen, wenn Du MinGW verwendest).
Außerdem mußt Du, wenn Du nicht schon hast, eine statisch verwendbare C/C++-Laufzeit beschaffen. Eigentlich sollte die Teil der gcc-Suite sein, aber keine Ahnung was da heutzutage alles wo hin ausgegliedert wurde.
#177012
geschrieben 06. Juni 2017 - 22:41
Also im Prinzip will ich das gar nicht so unbedingt mit dem statischen Linken. Sieht ja auch viel professioneller aus, wenn im Programme-Ordner nach der Installation ein bißchen was drin ist. Mir würde ja reichen, wenn mir die Umgebung sagt, welche DLL ich mitgeben muß. Wenn die die Eintäge in diese Linkliste macht, müßte das doch bekannt sein.
Ansonsten habe ich VS (für 64bit Anwendungen) und MinGW (für 32bit Anwendungen).
Dieser Beitrag wurde von Holger_N bearbeitet: 06. Juni 2017 - 22:47
#177013
geschrieben 06. Juni 2017 - 22:46
Ansonsten hast Du zwar nicht ganz unrecht, aber am Ende des Tages ist die statische Lösung... nicht immer, aber oft die professionellere. Sie ist robuster und sie ist weniger malware-anfällig, weil Funktionen nicht zur Laufzeit eingebunden werden.
Wie Du's am Ende vertreibst ist ja egal. Wichtig ist nur, daß es richtig funktioniert, und da nimmt sich das alles nix.
#177014
geschrieben 06. Juni 2017 - 22:57
#177015
geschrieben 07. Juni 2017 - 08:07
Hab ich denen den Vogel gezeigt.

Hilfe
Neues Thema
Antworten



Nach oben


