ventajas que microsoft funciona desventajas curso como apps c cross-platform 32-bit

microsoft - xamarin que es y como funciona



Escribir aplicaciones multiplataforma en C (7)

Existen bastantes bibliotecas portátiles solo ejemplos que he trabajado en el pasado

1) glib y gtk +

2) libcurl

3) libapr

Esos cubren casi todas las plataformas, por lo que 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í.

¿Qué cosas deberían tenerse más en cuenta al escribir aplicaciones multiplataforma en C? Plataformas específicas: PC, Mac y Linux basados ​​en Intel de 32 bits. Estoy especialmente buscando el tipo de versatilidad que Jungle Disk tiene en su edición de escritorio USB ( http://www.jungledisk.com/desktop/download.aspx )

¿Qué son consejos y "trampas" para este tipo de desarrollo?


También secundé 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. Por ejemplo, esto es algo relacionado con el sistema operativo (por ejemplo, el molesto CR, CRLF, LF en archivos de texto) o cosas de hardware. Por ejemplo, la compatibilidad de posix mencionada anteriormente no lo detiene de

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

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


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

Admiten al menos LINUX, Windows y MAC.


Además de la respuesta de Kyle, recomendaría encarecidamente no intentar 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 ser consciente de 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 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.


Intenta escribir todo lo que puedas con POSIX. Mac y Linux son compatibles con POSIX de forma nativa y Windows tiene un sistema que puede ejecutarlo (hasta donde yo 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.


Intente evitar los #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, Administración de código multiplataforma . El código de muestra puede parecer obsoleto, pero las ideas que se describen en el libro aún son brillantemente vitales.


Mantuve durante varios años una biblioteca de redes 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 GUI, le sugiero que consulte los kits de herramientas de GUI como WxWindows o Qt (que son ambas bibliotecas de C ++).