gcc (mingw) statisch kompilieren

#7410523
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

Moderator Persönliche Seite #7410534
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.

#7410547
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

#7410555
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?

Beitrag #7410589 wurde von einem Moderator gelöscht.
#7411252
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

Angehängte Dateien:
#7411351
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren