Liebes Forum, ich nutze gcc (mingw) auf einem Windows-10-PC. Ich habe ein C-Programm mit #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <windows.h> #include <math.h> geschrieben. Das "exe" soll auf anderen Windows-PCs laufen, die nicht über eine mingw-Umgebung verfügen. Wie muss ich kompilieren, damit alles sozusagen "an Bord" ist. Geht das mit der Option -static ? Viele Grüße, Alexander
Alexander P. schrieb: > Das "exe" soll auf anderen Windows-PCs laufen, die nicht über eine > mingw-Umgebung verfügen. Im Gegensatz zu Cygwin (welches eine Posix-Umgebung für Windows implementiert) ist der Sinn von MinGW ja eigentlich, dass es auf native Windows-APIs zurückgreift. Insofern sollte ein damit generiertes Executable erst einmal keine spezielle "MinGW-Umgebung" auf dem Zielsystem benötigen. Allerdings kann man natürlich trotzdem beim Bauen Abhängigkeiten von zusätzlichen Bibliotheken einbauen, die bei dynamischem Linken dann auf dem Zielsystem verfügbar sein müssen, damit es läuft. Ein Beispiel: ich habe über viele Jahre AVRDUDE für Windows auf einem FreeBSD erzeugt und dabei die Abhängigkeit von libusb drin gehabt, damit man auf über USB angeschlossene Programmer zugreifen kann. Jemand, der das nicht benötigt, musste dann trotzdem noch libusb installiert haben, damit das Programm gestartet werden kann. > Wie muss ich kompilieren, damit alles sozusagen > "an Bord" ist. Geht das mit der Option -static ? Das sollte genau das tun, ja. Das erzeugte Binary wird dann recht groß. Du könntest nachher noch die Symboltabelle mit dem Kommando "strip" entfernen. Diese belastet zwar nicht den Hauptspeicher zur Laufzeit (da sie nicht geladen wird), vergrößert aber dennoch das Binary.
Ja - wenn du tatsächlich mit einem mingw-gcc kompilierst. Das executable ist dann zwar auch nicht vollständig standalone, aber es braucht nur Windows-dlls, die auf jedem Windows-Rechner vorhanden sein sollten. Oliver
Hallo Jörg, danke für die Antwort. Ich habe mein Programm vor wenigen Tagen mit -static kompiliert und festgestellt, daß die Programmgröße (.exe-Datei) sich dadurch nicht geändert hat. Das ließ mich annehmen, daß eben nicht alles an Bord ist. Ich habe es allerdings noch nicht auf dem Ziel-PC ohne mingw testen können, da ich den Abnehmer nicht mit vielen unsinnigen Versuchen nerven möchte. Viele Grüße, Alexander
Hallo Oliver, danke. Ich habe einmal beim Anwender ohne -static getestet und das ist gescheitert. Ich muß davon ausgehen, daß sind Windows funktionsfähig ist. Viele Grüße, Alexander
Alexander P. schrieb: > Das "exe" soll auf anderen Windows-PCs laufen, die nicht > über eine mingw-Umgebung verfügen. Normalerweise erzeugt MinGW Binaries, die mit der schon zu Win9x-Zeiten mitgelieferten CRT gelinkt sind, die würden also prinzipiell überall laufen. Der Haken ist die libgcc und ggf. die libstdc++, die kann man aber statisch linken lassen, indem man beim Linken die Parameter -static-libgcc und -static-libstdc++ mitgibt. Überprüfen kannst Du das z.B. mit Dependency Walker. Jörg W. schrieb: > habe über viele Jahre AVRDUDE für Windows auf einem FreeBSD erzeugt und > dabei die Abhängigkeit von libusb drin gehabt, damit man auf über USB > angeschlossene Programmer zugreifen kann. Laufen die neueren Versionen ohne libusb, oder werden die bloss nicht mehr von Dir gebaut?
Hmmm schrieb: > Laufen die neueren Versionen ohne libusb, oder werden die bloss nicht > mehr von Dir gebaut? Die fallen jetzt bei Github aus dem CI raus. Damit muss ich mich (als Nicht-Windows-Nutzer) endlich nicht mehr selbst drum kümmern. ;-)
Alexander P. schrieb: > Ich habe einmal beim Anwender ohne -static getestet und das ist > gescheitert. Ich muß davon ausgehen, daß sind Windows funktionsfähig > ist. Ich bezog mich ja auch auf deine Frage Alexander P. schrieb: > Geht das mit der Option -static ? Oliver
Beitrag #7410589 wurde von einem Moderator gelöscht.
Vielen Dank für die Antworten. Auch der Aufruf gcc -static-libgcc -static-libstdc++ blabla.c -o blabla.exe ändert nicht die Größe der Datei blabla.exe gegenüber gcc blabla.c -o blabla.exe Viele Grüße, Alexander
Ich kenne das Tool leider nicht und werde erst morgen dazu kommen, mich an der Stelle aufzuschlauen. Viele Grüße, Alexander
Jetzt habe ich den Dependency Walker heruntergeladen und ausprobiert. Er schien schwer beeindruckt gewesen zu sein und erzeugte einen Abhängigkeitsbaum mir mehreren hundert Einträgen. Ich kann damit nicht viel anfangen. Bei dem C-Programm handelt es sich um mathematische Programmierung (Funktionsapproximation, komplexe Arithmetik, DFT/FFT u.s.w.). Ein Ascii-File wird eingelesen, es wird gerechnet und ein Ascii-File wird ausgegeben. Das exe-File ist gerade einmal 62501 Bytes groß. Ich werde das gute Stück portionieren und versuchen herauszubekommen, an welchen Stellen es klemmt. Viele Grüße, Alexander
Alexander P. schrieb: > Jetzt habe ich den Dependency Walker heruntergeladen und ausprobiert. Er > schien schwer beeindruckt gewesen zu sein und erzeugte einen > Abhängigkeitsbaum mir mehreren hundert Einträgen. Den Baum kannst Du bis auf die erste Ebene zuklappen, der Rest sind nur die Abhängigkeiten der Abhängigkeiten. Da sollte dann eine Liste übrigbleiben, die Du problemlos an den Fingern abzählen kannst. Und bei diesen DLLs ist dann interessant, ob es Windows-DLLs sind, mit Rechtsklick und Properties erfährst Du etwas mehr.
Wenn ich den Baum "gesundschrumpfe" bleiben nur Kernel32.DLL und MSVCRT.DLL übrig. Das wird vermutlich bei halbwegs allen Programmen der Fall sein.
Alexander P. schrieb: > Wenn ich den Baum "gesundschrumpfe" bleiben nur Kernel32.DLL und > MSVCRT.DLL übrig. Das wird vermutlich bei halbwegs allen Programmen der > Fall sein. Ja, so sollte es problemlos auf beliebigen Windows-Rechnern laufen.
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.