2010-11-03 26 views
10

¿Hay alguna manera de compilar un archivo fuente c/C++ para generar un archivo .exe que pueda ejecutarse en otros procesadores en diferentes computadoras? Estoy pidiendo esto para la plataforma de Windows. Sé que se puede hacer con java o C#, pero usa una máquina virtual.¿Cómo puedo hacer un ejecutable portátil?

PD: Para aquellos que dijeron que se puede hacer solo con máquinas virtuales o se debe compilar el código fuente en cada máquina, estoy preguntando si todos los virus están escritos en Java o C# y necesita una máquina vm para ser infectado o necesita compilar el bacalao fuente de gusano en su máquina para infectarse? (No estoy tratando de crear un virus, pero es un buen ejemplo :))

+5

mismo sistema operativo o no? Esa es la pregunta. – leppie

+0

¿Debe .exe implicar COFF, o puede ser ELF o cualquier otro formato binario? Esa es otra pregunta ... –

+0

Sí, el mismo sistema operativo (en este caso, Windows). – Stefan

Respuesta

22

Diferentes computadoras usan diferentes conjuntos de instrucciones, llamadas al sistema operativo, etc., razón por la cual el código máquina es específico de la plataforma. Esta es la razón por la cual varias tecnologías como el código de bytes, las máquinas virtuales, etc., se han desarrollado para permitir ejecutables portátiles. Sin embargo, generalmente C/C++ se compila directamente en el código máquina específico de la plataforma.

Por lo tanto, Windows exe simplemente no se ejecutará en otra plataforma sin algún tipo de capa de emulación.

Sin embargo, puede hacer que su C/C++ código fuente portátil. Esto significa que todo lo que necesita hacer para que su aplicación se ejecute en otra plataforma es compilarla para esa plataforma.

3

La respuesta corta es: no se puede. Una respuesta más larga es escribir en C/C++ portátil (estándar) y compilar en las plataformas que necesita.

+1

No, la respuesta más larga es que puedes, pero es probable que no quieras. (Compilar, por ejemplo, el código de bytes de Java). –

+4

@Amigable Existen muchas plataformas para las cuales no existe JVM, pero tiene un compilador de C compatible. –

+0

sí absolutamente, pero esa no era la pregunta original. –

1

Puede, sin embargo, hacerlo en un idioma diferente. Si necesita algo para ejecutar en múltiples plataformas, le sugiero que investigue Java. Lenguaje similar a c/C++, y usted puede "compilar" (tipo de) programas para ejecutar prácticamente en cualquier computadora.

+2

No veo cómo Java es similar a C/C++ –

+0

@Armen Tsirunyan: Bastante simple: Java se basa en C++. – Gorpik

+0

@Gorpik: sintácticamente, tal vez, pero el paradigma de los dos idiomas es bastante diferente –

12

Sí, puede, pero no es necesariamente una buena idea.

Apple introdujo la idea de un fat binary cuando estaban migrando desde el Motorola 68000 a los chips PowerPC a principios de los 90 (no digo que lo hayan inventado, esa es la primera encarnación que conozco). Ese enlace también describe los binarios universales FatELF Linux pero, dado lo poco que escuchamos sobre ellos, parece que no han despegado.

Este era un único archivo que básicamente contenía los ejecutables 68000 y PowerPc agrupados en un único archivo y requería algunos conocimientos del sistema operativo para poder cargar y ejecutar el correspondiente.

Se podría, si estuviera tan inclinado, escribir un compilador que produjo un binario grasa que se ejecutan en un gran número de plataformas, pero:

  • sería terriblemente grande; y
  • casi seguro necesitarán cargadores especiales en cada sistema de destino.

Desde gcc tiene una enorme cantidad de soporte para diferentes plataformas y compilación cruzada por ejemplo, sería dónde iba a concentrar el esfuerzo, si yo fuera lo suficientemente loco como para intentar :-)

+11

+1 Solo por la escandalosa sugerencia de escribir un compilador. –

+1

apple todavía hace esto. 'binarios universales' contienen binarios PPC e Intel. editar: no es realmente un solo binario, los diferentes binarios (y metadatos como iconos) están contenidos dentro de un directorio que tiene una extensión de 'aplicación'. –

+0

Uno podría considerar usar clang, aunque está muy poco desarrollado, y podría requerir un envío clang con el binario. –

0

En realidad, algunos de operación los sistemas lo soportan; generalmente se llama "fat binary".

En particular, Mac OS lo usa (usa) para admitir PowerPC y x86 en un archivo binario.

En MS Windows sin embargo, esto no es posible ya que el sistema operativo no lo admite.

+0

Windows mantiene la compatibilidad ABI durante unos 20 años. No hay mucha necesidad de binarios gordos (a pesar de que son gordos dirigidos a la única plataforma de todos modos). Además, Windows solo se ejecuta en x86 y amigos. –

+0

@Matt: Bueno, según la Wikipedia, Windows NT solía ejecutarse en PowerPC, DEC Alpha y MIPS R4000. Y hoy en día hay x86 y x86-64, donde nuevamente los binarios gordos podrían ayudar. – sleske

0

El truco para hacer esto, es crear un archivo binario que tenga instrucciones de la máquina que se emularán en una máquina virtual en los sistemas operativos y procesadores que desee admitir.

La máquina virtual más extendida es la de la máquina virtual Java. Así que mi sugerencia sería mirar un compilador que compiles C code to Java byte code.

Además, Windows una vez trató x86 as a virtual machine en otras arquitecturas (Alpha).

0

Windows puede ejecutar ejecutables de 32 bits en modo de 64 bits sin ningún problema. Por lo tanto, su exe será portátil si lo compila en modo de 32 bits. O bien, debe liberar 2 versiones de su ejecutable. Si usa Java o C# (o cualquier lenguaje compilado por código de bytes), JIT/intérprete puede optimizar su código para el modo del sistema operativo actual, por lo que es totalmente portátil. Pero en C++, dado que produce código nativo, me temo que esto no se puede hacer excepto usar 2 versiones de tu binario.

0

Para resumir las otras respuestas, si desea crear un único archivo ejecutable que puede cargarse y ejecutarse en múltiples plataformas, que, básicamente, tiene dos opciones:

  1. crear una "grasa binaria" , que contiene el código de máquina para múltiples plataformas. Esto normalmente no es compatible con la mayoría de las herramientas de desarrollo y puede requerir cargadores especiales en la plataforma de destino;

  2. Recopile un código de bytes para la JVM o para .Net. He oído hablar de un compilador de C que genera código de bytes de Java (no recuerdo el nombre de fábrica), pero nunca lo usé, ni tengo idea de la calidad de la implementación.

Normalmente, el procedimiento para soportar múltiples plataformas en C es generar diferentes ejecutables para cada objetivo, ya sea mediante el uso de un compilador cruzado o ejecutar un compilador en cada plataforma. Eso requiere que pienses un poco en cómo escribes y organizas tu código fuente para que los bits específicos de la plataforma puedan intercambiarse fácilmente sin afectar la lógica general del programa, para variar los grados de "fácil".

0

La respuesta corta es que no puede, la respuesta larga es que hay varias opciones.

  1. Fat Binary. Lo malo es que esto requiere soporte de sistema operativo. El único sistema operativo de nivel de usuario que conozco que lo admite es OS X para su poder de PC a la migración de Intel.
  2. Sobre la marcha de traducción cruzada. Según lo utilizado por Transmeta y Apple. De nuevo, no hay ningún proveedor de soluciones generales que yo sepa.
  3. intérprete C \ C++. Hay al menos uno que conozco el cap. Se ejecuta en Windows, Linux, OS X. Nota Ch no es totalmente compatible con C++.
1

No confunda las plataformas del procesador con las plataformas del sistema operativo. para diferentes plataformas OS, los binarios de máquina son completamente diferentes. incluso no es posible hacer un mapeador de instrucciones uno a uno. es porque la arquitectura del conjunto de instrucciones completo puede ser diferente, y los diferentes grupos de instrucciones pueden tener un formato de instrucción totalmente diferente, e incluso pueden faltar algunas instrucciones o una plataforma de destino. Solo un emulador o máquina virtual puede hacer esto.

0

A esta pregunta le gusta preguntar "¿Hay alguna manera de viajar desde Canadá a otra ciudad del mundo?"

Y la respuesta es: "sí, hay".

para compilar un código fuente C/C++ en un archivo ejecutable en la plataforma Windows sin ninguna máquina virtual puede usar Windows Legacy API o MFC (especialmente con el uso de MFC en una biblioteca estática en lugar de Dll). Este archivo ejecutable se ejecuta aproximadamente en todas las PC que tienen Windows, porque Windows se ejecuta en solo 3 plataformas (x86, x64, IA64; excepto Windows 8 & 8.1 que admite ARM). Por supuesto, debe compilar los códigos fuente a x86 para ejecutar en 32 Las plataformas bit y x86-64 e Itaniums pueden ejecutar su exe en emulación. Pero sobre todos los procesadores que ejecutan Windows como su sistema operativo (como ARMS en los móviles), debe compilar eso para Windows Phone o Windows CE.

-1

puede escribir una mitad de la biblioteca ~ tales como:

 [ Library ] 

    [ mid-library] 

[linux part] [windows part] 

a continuación, puede utilizar la biblioteca, su aplicación va a ser portátil ~~

Cuestiones relacionadas