Forum: Compiler & IDEs gcc (mingw) statisch kompilieren


von Alexander P. (scientiapotentiaest)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Alexander P. (scientiapotentiaest)


Lesenswert?

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

von Alexander P. (scientiapotentiaest)


Lesenswert?

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

von Hmmm (hmmm)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

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.
von Alexander P. (scientiapotentiaest)


Lesenswert?

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

von Hmmm (hmmm)


Lesenswert?

Alexander P. schrieb:
> ändert nicht die Größe der Datei

Was sagt denn Dependency Walker?

von Alexander P. (scientiapotentiaest)


Lesenswert?

Ich kenne das Tool leider nicht und werde erst morgen dazu kommen, mich 
an der Stelle aufzuschlauen.

Viele Grüße, Alexander

von Alexander P. (scientiapotentiaest)


Angehängte Dateien:

Lesenswert?

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

von Hmmm (hmmm)


Lesenswert?

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.

von Alexander P. (scientiapotentiaest)


Lesenswert?

Wenn ich den Baum "gesundschrumpfe" bleiben nur Kernel32.DLL und 
MSVCRT.DLL übrig. Das wird vermutlich bei halbwegs allen Programmen der 
Fall sein.

von Hmmm (hmmm)


Lesenswert?

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