GNU/Linux >> Linux Esercitazione >  >> Linux

(C/C++) Come generare un file eseguibile che può essere eseguito su Windows e Linux?

Non c'è modo di avere un singolo eseguibile nativo compilato da sorgenti C++ che funzioni su piattaforme diverse. Non credo che lo stesso file eseguibile sia eseguito su Windows e Linux, come affermi nel secondo paragrafo.


La semplice risposta è che non puoi.

I formati binari eseguibili PE (Windows) ed ELF (Linux) sono totalmente diversi.

Per non parlare del fatto che un programma C/C++ richiede il collegamento a librerie che non saranno disponibili contemporaneamente su nessuna delle due piattaforme.

Tuttavia, è possibile utilizzare Wine su Linux per eseguire l'eseguibile di Windows, a condizione che non tenti chiamate specifiche di Windows esotiche.

Oppure potresti scegliere di utilizzare un linguaggio multipiattaforma più "comune" come un linguaggio CLI (C#/IronPython/Java ecc.) supportato da .NET per Windows e Mono per Linux/altri.


Ok, ragazzi.

Sì, PUOI scrivere un binario multipiattaforma, ma è difficile. Si chiama Fat Binary, ed era abbastanza comune negli anni '80, anche se non l'ho visto fare da decenni. https://en.wikipedia.org/wiki/Fat_binary

Fondamentalmente, si compila il codice macchina per ogni piattaforma su cui si desidera eseguire e quindi si collega manualmente il codice con diversi punti di ingresso. Sebbene l'articolo di Wikipedia descriva semplicemente l'impacchettamento di architetture diverse nello stesso binario, in realtà è possibile creare un binario che gira su sistemi operativi diversi purché i punti di ingresso per i sistemi operativi non collidano.

Alcuni formati eseguibili sono stati progettati intenzionalmente per consentire ciò. Ad esempio, MZ, NE, LX e PE possono essere sovrapposti. I vecchi programmi OS/2 a volte facevano questo... raramente contenevano un intero programma per entrambi i sistemi operativi, ma quando venivano eseguiti su DOS stampavano un messaggio che ti informava che stavi usando il sistema operativo sbagliato per il programma.

Per quanto riguarda Linux e Windows in un binario: Anche se non puoi fare un ELF e un PE, credo che potrebbe essere fattibile con un PIE o un COFF e un PE o COM. Il vecchio Linux eseguirà i binari COFF, da cui discende PE, quindi sembra che potresti essere in grado di creare un binario universale if le versioni più recenti di Linux continueranno a eseguirle. Non posso dire con certezza che funzionerebbe, ma sembra plausibile.

Un altro avvertimento:di solito è necessario inserire un salto nel codice proprio all'inizio per saltare oltre il punto di ingresso, le intestazioni e così via dell'altro sistema operativo perché non è possibile individuare il codice lì (ovviamente).

Il problema con questo nell'informatica moderna è che la maggior parte dei software antivirus lo identificherà erroneamente come un virus. Era comune che i virus attaccassero i binari inserendo un tale salto all'inizio di un eseguibile che saltava alla fine del binario, attaccando il proprio codice alla fine del binario, quindi inserendo un altro salto indietro all'eseguibile principale codice. Dal momento che devi fare qualcosa di più o meno simile per supportare più piattaforme in un file binario, la maggior parte dei software AV lo identificherà euristicamente come un virus e metterà in quarantena il tuo eseguibile.

Quindi in breve:SI può essere fatto per (alcune) combinazioni di piattaforme. Non è impossibile, ma dovresti essere pazzo per farlo.


Linux
  1. Come installare Wine ed eseguire app di Windows in Linux

  2. usando Linux come posso passare il contenuto di un file come parametro a un eseguibile?

  3. Come convertire un file eseguibile Linux (binario) in un file exe di Windows?

  4. Come posso eseguire un eseguibile Windows da WSL (Ubuntu) Bash

  5. Come posso eseguire un eseguibile non attendibile su Linux in modo sicuro?

Come eseguire Windows 95 su Linux

Come compilare ed eseguire programmi C, C++ in Linux

Come eseguire app Linux su Windows 10 e 11 utilizzando WSL

Come eseguire programmi C/C++ in Linux [Terminale ed Eclipse]

Come convertire un file .pem in un file .ppk su Windows e Linux

Come eseguire app della GUI Linux su Windows 10 con WSL e WSLg