Warum funktioniert ein Linux-kompiliertes Programm nicht unter Windows?

8

Ich bin mir fast sicher, dass mein Problem auf die Tatsache zurückzuführen ist, dass das kompilierte Programm als ausführbare Linux-Datei kompiliert wurde, aber ich möchte das einfach überprüfen.

%Vor%

Das obige "Programm" sollte unter Windows und Linux kompiliert werden, da es Quellcode-kompatibel ist, da es keine betriebssystemspezifischen Bibliotheken oder ähnliches gibt.

Wenn ich jedoch "c99 hello.c -o hallo.exe" in meine Linux-Box eintippe und dann diese "ausführbare Datei" auf eine Windows-Maschine übertrage, weigert sie sich zu laufen. Soweit ich weiß, erzeugt Linux eine ausführbare Datei, die nur unter Linux läuft, daher hat das Hinzufügen von ".exe" keine Auswirkungen. Um dieses Programm unter Linux für Windows zu erstellen, müsste ich dieses Programm auf einem Windows-Rechner neu kompilieren? Oder gibt es eine andere einfachere Methode, die funktioniert?

    
Thomas E 20.08.2015, 11:54
quelle

2 Antworten

19

Die ausführbaren Windows- und Linux-Dateien verwenden zwei verschiedene inkompatible Formate:

Unter Windows ist es das Format für portable ausführbare Dateien .

Unter Linux ist es das ELF (ausführbares und linkbares Format) .

Jedes Format verwendet die Besonderheiten des Betriebssystems, auf dem es ausgeführt werden soll, so dass sie normalerweise nicht auf einer anderen Plattform ausgeführt werden können.

Außerdem enthält eine ausführbare Datei nur einen kleinen Teil des Codes, der ausgeführt wird, nachdem sie in den Speicher geladen wurde. Eine ausführbare Datei ist mit Systembibliotheken verknüpft, die den größten Teil der Funktionalität bereitstellen, mit der das Programm mit dem System interagieren kann.
Da sich Systeme sehr stark voneinander unterscheiden, variieren Bibliotheken, und ein Programm für Linux kann unter FreeBSD nicht ausgeführt werden, obwohl letzteres auch ELF verwendet, da sie nicht mit den gleichen Bibliotheken verbunden sind.

Um eine Windows-Programmdatei unter Linux zu kompilieren, kann eine Technik verwendet werden, die als Cross-Compilation bezeichnet wird. Ein Compiler ist schließlich nur ein Programm, das in eine Binärdatei schreibt, so dass jeder Compiler theoretisch Code für jede Plattform schreiben kann, solange die Bibliotheken des Zielsystems zur Verfügung stehen, gegen die verlinkt werden kann.

Das Projekt MinGW-w64 bietet eine Toolchain, die dies ermöglicht. Sie können es beispielsweise auf debian-basierten Systemen mit dem Befehl sudo apt-get install mingw-w64 installieren.

Die installierten ausführbaren Dateien können wie folgt verwendet werden:

%Vor%     
SirDarius 20.08.2015, 12:05
quelle
0

Es ist eine Kompilierungssituation, anders als Java .exe haben keine virtuelle Maschine, um den Code in verschiedenen Betriebssystemen zu interpretieren. Dann muss er alle spezifischen .dlls und libs von OS haben, um den Job auszuführen, für den er erstellt wurde.

In .exe werden alle Dinge auf einem bestimmten Betriebssystem ausgeführt, anders in Java ist eine virtuelle Maschine die Magie, die Ihren Code auf verschiedenen Betriebssystemen interpretiert und ausführt.

    
Diogo Maschio 20.08.2015 12:08
quelle

Tags und Links