2008-08-30 19 views

Respuesta

9

Mantuve durante varios años una biblioteca de red ANSI C que fue portada a cerca de 30 sistemas operativos y compiladores diferentes. La biblioteca no tenía ningún componente de GUI, lo que lo hizo más fácil. Terminamos abstrayendo en archivos de origen dedicados cualquier rutina que no era consistente en todas las plataformas, y usamos #defines donde corresponde en esos archivos fuente. Esto mantiene el código que se ajustó por plataforma aislado de la lógica de negocios principal de la biblioteca. También hicimos un uso extensivo de typedefs y nuestros propios tipos dedicados para que pudiéramos cambiarlos fácilmente por plataforma si fuese necesario. Esto hizo que el puerto para plataformas de 64 bits fuera bastante fácil.

Si está buscando tener componentes de la GUI, le sugiero que consulte los juegos de herramientas GUI como WxWindows o Qt (que son ambas bibliotecas C++).

0

Intenta escribir tanto como puedas con POSIX. Mac y Linux son compatibles con POSIX de forma nativa y Windows tiene un sistema que puede ejecutarlo (hasta donde sé, nunca lo he usado). Si su aplicación es gráfica, tanto Mac como Linux son compatibles con las bibliotecas X11 (Linux de forma nativa, Mac a través de X11.app) y existen numerosas formas de hacer que las aplicaciones X11 se ejecuten en Windows.

Sin embargo, si está buscando una verdadera implementación multiplataforma, probablemente debería cambiar a un lenguaje como Java o Python que sea capaz de ejecutar el mismo programa en múltiples sistemas con poco o ningún cambio.

Editar: Acabo de descargar la aplicación y miré los archivos. Parece tener binarios para las 3 plataformas en un directorio. Si le preocupa cómo escribir aplicaciones que se pueden mover de máquina a máquina sin perder configuraciones, probablemente debería escribir toda su configuración en un archivo en el mismo directorio que el ejecutable y no tocar el registro de Windows ni crear ningún directorio de puntos en la carpeta de inicio del usuario que ejecuta el programa en Linux o Mac. Y en cuanto a la creación de un binario Linux de distribución cruzada, POSIX/X11 de 32 bits probablemente sea la apuesta más segura. No estoy seguro de qué usa JungleDisk ya que actualmente estoy en una Mac.

4

Además de la respuesta de Kyle, recomendaría encarecidamente contra tratando de usar el subsistema Posix en Windows. Se implementa a un nivel mínimo básico absoluto, de modo que Microsoft puede reclamar el "soporte Posix" en una casilla de verificación de la hoja de características. Quizás alguien en realidad lo usa, pero nunca lo he visto en la vida real.

Ciertamente se puede escribir código C multiplataforma, solo hay que tener en cuenta las diferencias entre plataformas, y probar, probar, probar. Las pruebas unitarias y una solución de CI (integración continua) contribuirán en gran medida a garantizar que su programa funcione en todas sus plataformas de destino.

Un buen enfoque es aislar las cosas dependientes del sistema en uno o unos pocos módulos como máximo. Proporcione una interfaz independiente del sistema de ese módulo. Luego, compila todo lo demás sobre ese módulo, para que no dependa del sistema para el que estás compilando.

7

Trate de evitar #ifdefs dependientes de la plataforma, ya que tienden a crecer exponencialmente cuando agrega plataformas nuevas. En su lugar, intente organizar sus archivos fuente como un árbol con código independiente de la plataforma en la raíz, y el código dependiente de la plataforma en las "hojas". Hay un buen libro sobre el tema, Multi-Platform Code Management. El código de muestra puede parecer obsoleto, pero las ideas que se describen en el libro aún son brillantemente vitales.

0

sí existen muy pocas bibliotecas portátiles sólo ejemplos que he trabajado en el pasado GTK

1) simplista y +

2) libcurl

3) libapr

Aquellos cubren casi cada plataforma y por lo tanto son una herramienta extremadamente útil.

Posix está bien en Unices, pero bien, dudo que sea tan bueno en Windows, además de que no tenemos nada para GUI portátiles allí.

0

XVT tiene una API GUI C multiplataforma que tiene más de 15 años y se encuentra en la parte superior de los toollkits de ventanas nativas. See WWW.XVT.COM.

Admiten al menos LINUX, Windows y MAC.

0

También estoy en segundo lugar la recomendación de separar el código para diferentes plataformas en diferentes módulos/árboles en lugar de ifdefs.

También recomiendo comprobar de antemano cuáles son las diferencias en sus plataformas y cómo puede abstraerlas. P.ej. esto es algo relacionado con el sistema operativo (por ejemplo, el molesto CR, CRLF, LF en archivos de texto) o cosas de hardware. P.ej. el anterior compability POSIX mencionado duerma le impida

int c; 
fread(&c, sizeof(int), 1, file); 

Pero en diferentes plataformas de hardware el diseño de memoria interna puede ser completamente diferente (endianess), lo que obligó a utilizar las funciones de conversión de algunas de las plataformas de destino.

Cuestiones relacionadas