que programa para ejecutar con compilar compilador c++ c windows linux platform

ejecutar - programa para compilar c++



¿Cómo escribo un programa en C++ que se compilará fácilmente en Linux y Windows? (9)

Estoy haciendo un programa C ++.

Una de mis mayores molestias con C ++ es su supuesta independencia de plataforma.

Probablemente todos sepan que es prácticamente imposible compilar un programa Linux C ++ en Windows y uno de Windows en Linux sin una avalancha de errores crípticos y archivos de inclusión específicos de la plataforma.

Por supuesto, siempre puedes cambiar a una emulación como Cygwin y vino, pero te pregunto, ¿realmente no hay otra manera?


El lenguaje en sí es multiplataforma, pero la mayoría de las bibliotecas no lo son, pero hay tres cosas que debe tener en cuenta si quiere ir completamente multiplataforma al programar en C ++.

En primer lugar, debe comenzar a utilizar algún tipo de sistema de compilación multiplataforma, como SCons . En segundo lugar, debe asegurarse de que todas las bibliotecas que está utilizando estén diseñadas para ser multiplataforma. Y un tercer punto menor, recomendaría usar un compilador que existe en todas sus plataformas de destino, gcc viene a la mente aquí (C ++ es una bestia bastante compleja y todos los compiladores tienen sus propias peculiaridades).

Tengo algunas sugerencias adicionales sobre las interfaces gráficas de usuario para usted. Hay varios de estos disponibles para usar, los tres más notables son:

GTK + y QT son dos API que vienen con sus propios conjuntos de widgets (botones, listas, etc.), mientras que wxWidgets es más una API contenedora para el conjunto de widgets nativos de las plataformas actualmente en ejecución. Esto significa que los dos primeros pueden parecer un poco diferentes en comparación con el resto del sistema, mientras que el último se verá como un programa nativo.

Y si te gusta la programación de juegos, también hay muchas API para elegir, todas ellas también multiplataforma. Los dos más completos que conozco son:

Ambos contienen todo, desde gráficos hasta rutinas de entrada y audio, ya sea a través de complementos o incorporados.

Además, si crees que la biblioteca estándar en C ++ es un poco escasa, echa un vistazo a Boost para obtener una dulzura multiplataforma de propósito general.

Buena suerte.


C ++ es multiplataforma. El problema que parece tener es que está usando librerías dependientes de la plataforma.

Supongo que realmente está hablando sobre los componentes UI, en cuyo caso sugiero usar algo como GTK +, Qt o wxWindows, cada uno de los cuales tiene componentes de interfaz de usuario que se pueden compilar para diferentes sistemas.

La única solución es encontrar y usar librerías independientes de la plataforma.

Y, en una nota lateral, ni Cygwin ni Wine son emulaciones: son implementaciones 100% nativas de la misma funcionalidad que encontraron sus respectivos sistemas.


Compilarlo en Windows y nuevamente en Linux. A menos que use bibliotecas específicas de la plataforma, debería funcionar. No es como Java, donde lo compila una vez y funciona en todas partes. Nadie ha creado una máquina virtual para C ++, y probablemente nunca lo hará. El código que escriba en C ++ funcionará en cualquier plataforma. Solo tienes que compilarlo en cada plataforma primero.


Cree una capa de bajo nivel que contendrá todo el código específico de la plataforma en su proyecto. Implemente 2 versiones de esta capa, una para Windows y otra para Linux, con la misma interfaz y compártalas en 2 bibliotecas. Acceda a todas las funcionalidades específicas de la plataforma en su proyecto a través de esa interfaz.

Esta capa puede contener clases generales de acceso a archivos, impresión, GUI, etc.

Todo el código (ahora no específico de la plataforma) que usa esa capa ahora se puede compilar una vez en Windows y una vez en Linux.


Se adhieren a ANSI C ++ y las bibliotecas que son multiplataforma y debería estar bien.


Sugerencias:

  • Use typedef''s para ints. O #include <stdint.h>. Algunas máquinas piensan que int tiene 8 bytes, algunos 4. (Solía ​​ser 2 y 4. Cómo han cambiado los tiempos).

  • Use la encapsulación siempre que sea posible. El compilador de mi última ventana pensó que% lld era% I64d ", dio valores de retorno retorcidos para vsnprintf (), problemas similares con close () y sockets, etc.

  • Tenga cuidado con los límites de tamaño de la pila / tamaño del búfer. Me encontré con un límite de buffer 8k UDP en Windows, entre otros problemas.

  • Por algún motivo, el compilador de C ++ de mi ventana no aceptaba asignaciones de tamaño dinámico fuera de la pila. Ej: void foo (int a) {int b [a]; } Sé consciente de ese tipo de cosas. Planifica cómo vas a recodificar.

  • #ifdef puede ser tu mejor amigo. ¡Y tu peor enemigo! (¡Al mismo tiempo!)

Sin duda se puede hacer. ¡Pero compila y prueba temprano y a menudo!



C ++ estándar es compilaciones de código sin errores en cualquier plataforma. Intente utilizar Bloodshed Dev C ++ en Windows (en lugar de VC ++ / Borland C ++).

Como Bloodshed Dev C ++ confirma los estándares de C ++, los programas compilados se compilarán en Linux sin errores en la mayoría de los casos.


Una vez que te das cuenta de los problemas, en realidad no es tan difícil. Todo el código en el que estoy trabajando actualmente compila en Windows de 32 y 64 bits, todos los sabores de Linux , así como Unix (Sun, HP e IBM). Obviamente, estos no son productos de GUI. Además, no utilizamos bibliotecas de terceros, a menos que las compilemos nosotros mismos.

Tengo un archivo .h que contiene todo el código específico del compilador. Por ejemplo, Microsoft y gcc están en desacuerdo sobre cómo especificar un entero de 8 bits. Entonces en el .h, tengo

#if defined(_MSC_VER) typedef __int8 int8_t; #elif defined(__unix) typedef char int8_t; #endif

También hay bastante código que uniformiza ciertas llamadas a funciones de bajo nivel, por ejemplo:

#if defined(_MSC_VER) #define SplitPath(Path__,Drive__,Name__,Ext__) _splitpath(Path__,Drive__,Dir__,Name__,Ext__) #elif defined(__unix) #define SplitPath(Path__,Drive__,Name__,Ext__) UnixSplitPath(Path__,Drive__,Name__,Ext__) #endif

Ahora, en este caso, creo que tuve que escribir una función UnixSplitPath (); habrá momentos en que lo necesite. Pero la mayoría de las veces, solo tiene que encontrar la función de reemplazo correcta. En mi código, llamaré a SplitPath (), aunque no es una función nativa en ninguna plataforma; las #defines lo resolverán por mí. Lleva un tiempo entrenar a ti mismo.

Créalo o no, mi archivo .h tiene solo 240 líneas. Realmente no hay mucho para eso. Y eso incluye el manejo de problemas endian.

Algunas de las cosas de nivel inferior necesitarán una compilación condicional. Por ejemplo, en Windows, utilizo Secciones críticas, pero en Linux necesito usar pthread_mutex. Las secciones de CriticalSection fueron encapsuladas en una clase, y esta clase tiene una buena cantidad de compilación condicional. Sin embargo, el programa de nivel superior es totalmente inconsciente, la clase funciona exactamente igual independientemente de la plataforma.

El otro secreto que puedo darte es: crea tu proyecto en todas las plataformas a menudo (especialmente al principio). Es mucho más fácil cuando se cortan los problemas del compilador de raíz. No espere hasta que haya terminado el desarrollo antes de intentar ir a través de la plataforma.