Estaba terminando uno de mis primeros proyectos de C ++ que, según el marco, se supone que es multiplataforma. Desarrollé el proyecto completamente en Windows y Visual Studio, pensando que dado que las bibliotecas son todas multiplataforma, entonces hacer la compilación OSX "más adelante" sería trivial. Esto resultó no ser el caso, sino que el "código de Windows" no se ejecuta correctamente y tenía que solucionar algunos errores de compilación.
¿Qué técnicas existen para garantizar de antemano que el código sea compatible con todas las plataformas? ¿Desarrollando todas las plataformas simultáneamente, probando el código contra cada plataforma al mismo tiempo, cuando se agregan nuevas características, en lugar de desarrollar las diferentes versiones de la plataforma una tras otra? (*)
Buscando consejos específicos que no dependan de las herramientas, sino más bien de "procesos de desarrollo" que ayuden a la compatibilidad multiplataforma, independientemente de las herramientas que se utilicen. Como el anterior (*).
Específicamente, estoy desarrollando un complemento VST con WDL-OL ( https://github.com/olilarkin/wdl-ol ) y algunas bibliotecas DSP multiplataforma. Los proyectos WDL-OL tienen configurados proyectos VS y Xcode, pero supongo que los problemas provienen de las bibliotecas y luego de las diferencias en los compiladores.
fuente
Respuestas:
Crear código portátil puede ser muy desafiante.
Primero algunos consejos obvios relacionados con el lenguaje:
Luego, un par de recomendaciones de diseño:
Finalmente los puntos delicados:
TCHAR
), pero esto puede ser un desafío en combinación con la biblioteca estándar (por ejemplo,cout
vswcout
para ser usado dependiendo si se usachar
owchar_t
)Pero estos son solo consejos. En esta área no puedes obtener certeza.
fuente
-Wall -Wextra -Werror
-pedantic
.No hay nada que pueda garantizar que el código sea compatible con una plataforma que no sea construirlo, ejecutarlo y probarlo allí. Por lo tanto, el enfoque de todas las personas sanas es construir, ejecutar y probar su aplicación en cada plataforma que proyecten, será necesario construirla, ejecutarla y probarla.
La integración continua (CI) puede aliviar un poco esta carga para proyectos más pequeños, ya que puede obtener agentes de compilación baratos o gratuitos para algunas plataformas (principalmente Linux), hacer su desarrollo en Windows y simplemente regresar a Linux cuando haya un problema.
Sin embargo, OSX CI es bastante complicado.
fuente
Si está solicitando "procesos de desarrollo" y su plataforma de desarrollo principal es Windows con Visual Studio, le sugiero que intente construir su proyecto sin "windows.h" incluido. Obtendrá muchos errores de compilación que lo llevarán a muchos lugares donde necesitará refactorizar su código. Por ejemplo, 'DWORD' no estará #definido y deberá reemplazarlo
uint32_t
todas partes (google forstdint.h
y encontrará información útil sobre tipos enteros y sus definiciones multiplataforma). A continuación, deberá reemplazar todas las llamadas a la API de Win32, como,Sleep()
con su equivalente multiplataforma (de nuevo, google es su mejor amigo, quien mostrará preguntas y respuestas relevantes en los sitios stack * .com). Probablemente no tenga éxito en encontrar todos los reemplazos multiplataforma relevantes para su código y tendrá que devolver suinclude "windows."
directiva pero ponerla debajo#ifdef _WIN32
. Más detalles aquíSiga haciendo preguntas más concretas y obteniendo respuestas: esta es una sugerencia general de "lo que debería ser el proceso de desarrollo"
EDITAR 1 Otro mi sugerencia es usar gcc y / o clang en su máquina de desarrollo de Windows (junto con Visual Studio)
fuente
Depende de los "errores de compilación" que mencione. Sin saber lo que eran, es imposible ser específico.
Tengo código multiplataforma para Windows / Linux / iOS / Android / Mac. Cada nueva plataforma trajo algunos errores y advertencias adicionales cuando se agregó por primera vez. Aprenderá rápidamente qué construcciones traen problemas. Evítelos o abstraiga las diferencias en un encabezado con
#ifdef
s. Intenta nunca#ifdef
entre plataformas dentro de su propio código.Un ejemplo:
crea una instancia temporal de la
MyClass
cual se elimina una vez quemyfunction
ha regresado. Con algunos de mis compiladores de C ++, esa instancia es de lectura / escritura (y el hecho de que sea temporal y pronto será destruido no preocupa al compilador). Con otros,myfunction
tiene que redefinirse para tomar unconst MyClass &
, o el compilador se queja. No importa lo que diga el estándar C ++, o qué compilador es correcto y cuál es incorrecto. Después de encontrar el error un par de veces sé que (a) o bien declarar una variable temporal del tipoMyClass
y pasar a quemyfunction
o (b) declarar la referenciaconst
enmyfunction
y utilizarmutable
aquí y allá para deconstify.En pocas palabras: acumule experiencia y desarrolle sus propios estándares de codificación.
fuente
Una posible forma de ayudar a la portabilidad podría ser confiar solo en las declaraciones y características proporcionadas por el estándar C ++ 11 , y mediante el uso de bibliotecas y marcos multiplataforma como POCO & Qt .
Pero incluso esto no es a prueba de fallas. Recuerda el aforismo
Con práctica, disciplina y mucha experiencia, portar un programa a otra plataforma generalmente se puede hacer rápidamente. Pero la experiencia y el saber hacer son muy importantes.
fuente