GNU/Linux >> LINUX-Kenntnisse >  >> Linux

(C/C++) Wie generiert man eine ausführbare Datei, die sowohl unter Windows als auch unter Linux ausgeführt werden kann?

Es gibt keine Möglichkeit, eine einzelne native ausführbare Datei aus C++-Quellen zu kompilieren, die auf verschiedenen Plattformen funktioniert. Ich glaube Ihnen nicht, dass dieselbe ausführbare Datei unter Windows und Linux ausgeführt wird, wie Sie in Ihrem zweiten Absatz angeben.


Die einfache Antwort ist, dass Sie es nicht können.

Die binären ausführbaren Formate PE (Windows) und ELF (Linux) sind völlig unterschiedlich.

Ganz zu schweigen davon, dass ein C/C++-Programm das Linken zu Bibliotheken erfordert, die auf keiner der beiden Plattformen gleichzeitig verfügbar sein werden.

Sie können jedoch Wine unter Linux verwenden, um die ausführbare Windows-Datei auszuführen, vorausgesetzt, es versucht keine exotischen Windows-spezifischen Aufrufe.

Oder Sie können eine „gängigere“ plattformübergreifende Sprache wie eine CLI-Sprache (C#/IronPython/Java usw.) verwenden, die von .NET für Windows und Mono für Linux/andere unterstützt wird.


Okay, Kinder.

Ja, Sie KÖNNEN eine Binärdatei für mehrere Plattformen schreiben, aber es ist schwierig. Es heißt Fat Binary und war in den 1980er Jahren weit verbreitet, obwohl ich es seit Jahrzehnten nicht mehr gesehen habe. https://en.wikipedia.org/wiki/Fat_binary

Grundsätzlich kompilieren Sie den Maschinencode für jede Plattform, auf der Sie ausführen möchten, und verknüpfen den Code dann manuell mit verschiedenen Einstiegspunkten. Während der Wikipedia-Artikel lediglich das Packen verschiedener Architekturen in dieselbe Binärdatei beschreibt, ist es tatsächlich möglich, eine Binärdatei zu erstellen, die auf verschiedenen Betriebssystemen läuft, solange die Einstiegspunkte für die Betriebssysteme nicht kollidieren.

Einige ausführbare Formate wurden absichtlich entwickelt, um dies zu ermöglichen. Beispielsweise können MZ, NE, LX und PE überlagert werden. Alte OS/2-Programme taten dies manchmal ... sie enthielten selten ein vollständiges Programm für beide Betriebssysteme, aber wenn sie unter DOS ausgeführt wurden, gaben sie eine Meldung aus, die Ihnen mitteilte, dass Sie das falsche Betriebssystem für das Programm verwendeten.

Was Linux und Windows in einer Binärdatei betrifft: Während Sie kein ELF und PE machen können, glaube ich, dass es vielleicht ist mit einem PIE oder einem COFF und einem PE oder COM machbar sein. Ältere Linux-Versionen führen COFF-Binärdateien aus, von denen PE abstammt, also scheint es, dass Sie in der Lage sein könnten, eine universelle Binärdatei if zu erstellen neuere Versionen von Linux werden diese weiterhin ausführen. Ich kann nicht sicher sagen, ob das funktionieren würde, aber es scheint plausibel.

Ein weiterer Vorbehalt:Normalerweise müssen Sie direkt am Anfang einen Sprung in den Code einfügen, um den Einstiegspunkt, die Header usw. des anderen Betriebssystems zu überspringen, da Sie Ihren Code dort (offensichtlich) nicht finden können.

Das Problem bei modernen Computern besteht darin, dass die meisten Antivirenprogramme dies fälschlicherweise als Virus identifizieren. Früher war es üblich, dass Viren Binärdateien angriffen, indem sie einen solchen Sprung am Anfang einer ausführbaren Datei einfügten, die zum Ende der Binärdatei sprang, ihren eigenen Code an das Ende der Binärdatei anhefteten und dann einen weiteren Sprung zurück zur ausführbaren Hauptdatei einfügten Code. Da Sie etwas mehr oder weniger Ähnliches tun müssen, um mehrere Plattformen in einer Binärdatei zu unterstützen, wird die meiste AV-Software dies heuristisch als Virus identifizieren und Ihre ausführbare Datei unter Quarantäne stellen.

Kurz gesagt:JA, es kann für (einige) Kombinationen von Plattformen durchgeführt werden. Es ist nicht unmöglich, aber man müsste verrückt sein, um es zu tun.


Linux
  1. Wie kann ich eine Datei unter Linux symbolisch verknüpfen?

  2. Wie verwende ich / (Verzeichnistrennzeichen) sowohl unter Linux als auch unter Windows in Python?

  3. Wie kann ich eine ausführbare Windows-Datei von WSL (Ubuntu) Bash ausführen

  4. Wie kann man feststellen, ob eine Linux-Binärdatei 32-Bit oder 64-Bit ist?

  5. Wie kann ich eine nicht vertrauenswürdige ausführbare Datei sicher unter Linux ausführen?

So führen Sie Windows 95 unter Linux aus

So kompilieren und führen Sie C- und C++-Programme unter Linux aus

So führen Sie Linux-Apps unter Windows 10 und 11 mit WSL aus

So führen Sie C/C++-Programme unter Linux aus [Terminal &Eclipse]

So konvertieren Sie eine .pem-Datei in eine .ppk-Datei unter Windows und Linux

So führen Sie Linux-GUI-Apps unter Windows 10 mit WSL und WSLg aus