GNU/Linux >> Tutoriales Linux >  >> Linux

(C/C++) ¿Cómo generar un archivo ejecutable que pueda ejecutarse tanto en Windows como en Linux?

No hay forma de tener un solo ejecutable nativo compilado desde una fuente de C++ que funcione en diferentes plataformas. No te creo que el mismo archivo ejecutable se ejecute en Windows y Linux, como dices en tu segundo párrafo.


La respuesta simple es que no puedes.

Los formatos ejecutables binarios PE (Windows) y ELF (Linux) son totalmente diferentes.

Sin mencionar que un programa C/C++ requiere vinculación a bibliotecas que no estarán disponibles en ninguna plataforma simultáneamente.

Sin embargo, puede usar Wine en Linux para ejecutar el ejecutable de Windows, siempre que no intente llamadas exóticas específicas de Windows.

O puede optar por utilizar un lenguaje multiplataforma más "común", como un lenguaje CLI (C#/IronPython/Java, etc.) compatible con .NET para Windows y Mono para Linux/otros.


Bien, niños.

Sí, PUEDES escribir un binario multiplataforma, pero es difícil. Se llama Fat Binary, y solía ser bastante común en la década de 1980, aunque no lo he visto en décadas. https://en.wikipedia.org/wiki/Fat_binary

Básicamente, compila el código de máquina para cada plataforma en la que desea ejecutar y luego vincula manualmente el código con diferentes puntos de entrada. Si bien el artículo de Wikipedia simplemente describe empaquetar diferentes arquitecturas en el mismo binario, en realidad es posible crear un binario que se ejecute en diferentes sistemas operativos siempre que los puntos de entrada de los sistemas operativos no colisionen.

Algunos formatos ejecutables fueron diseñados intencionalmente para permitir esto. Por ejemplo, se pueden superponer MZ, NE, LX y PE. Los programas antiguos de OS/2 a veces hacían esto... rara vez contenían un programa completo para ambos sistemas operativos, pero cuando se ejecutaban en DOS, mostraban un mensaje que le decía que estaba usando el sistema operativo incorrecto para el programa.

En cuanto a Linux y Windows en un binario: Si bien no puedes hacer un ELF y PE, creo que podría ser factible con un PIE o un COFF y un PE o COM. Linux más antiguo ejecutará binarios COFF, de los que desciende PE, por lo que parece que podría crear un binario universal si Las versiones más nuevas de Linux seguirán ejecutándose. No puedo asegurar que esto funcione, pero parece plausible.

Otra advertencia:por lo general, debe colocar un salto en el código justo al principio para saltar el punto de entrada, los encabezados, etc. del otro sistema operativo porque no puede ubicar su código allí (obviamente).

El problema con esto en la informática moderna es que la mayoría de los programas antivirus lo identificarán incorrectamente como un virus. Solía ​​ser común que los virus atacaran los binarios insertando un salto al principio de un ejecutable que saltaba al final del binario, agregando su propio código al final del binario y luego insertando otro salto de regreso al ejecutable principal. código. Dado que debe hacer algo más o menos similar para admitir múltiples plataformas en un binario, la mayoría del software AV lo identificará heurísticamente como un virus y pondrá en cuarentena su ejecutable.

En resumen:SÍ, se puede hacer para (algunas) combinaciones de plataformas. No es imposible, pero tendrías que estar loco para hacerlo.


Linux
  1. Cómo instalar Wine y ejecutar aplicaciones de Windows en Linux

  2. Usando Linux, ¿cómo puedo pasar el contenido de un archivo como parámetro a un ejecutable?

  3. ¿Cómo usar / (separador de directorio) tanto en Linux como en Windows en Python?

  4. ¿Cómo puedo ejecutar un ejecutable de Windows desde WSL (Ubuntu) Bash?

  5. ¿Cómo determinar si un archivo binario de Linux es de 32 bits o de 64 bits?

Cómo ejecutar Windows 95 en Linux

Cómo compilar y ejecutar programas C, C++ en Linux

Cómo ejecutar aplicaciones de Linux en Windows 10 y 11 usando WSL

Cómo ejecutar programas C/C++ en Linux [Terminal y Eclipse]

Cómo convertir un archivo .pem a un archivo .ppk en Windows y Linux

Cómo ejecutar aplicaciones GUI de Linux en Windows 10 con WSL y WSLg