Pregunta

¿Qué cosas se deben tener 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 tiene Jungle Disk en su edición de escritorio USB ( http://www.jungledisk.com/desktop/download.aspx )

¿Cuáles son los consejos y "trampas" para este tipo de desarrollo?

¿Fue útil?

Solución

Mantuve durante varios años una biblioteca de red ANSI C que fue adaptada a cerca de 30 sistemas operativos y compiladores diferentes.La biblioteca no tenía ningún componente GUI, lo que lo hacía más fácil.Terminamos abstrayendo en archivos fuente dedicados cualquier rutina que no fuera consistente en todas las plataformas y usamos #defines cuando correspondía en esos archivos fuente.Esto mantuvo el código ajustado por plataforma aislado de la lógica empresarial principal de la biblioteca.También hicimos un uso extensivo de typedefs y nuestros propios tipos dedicados para poder cambiarlos fácilmente por plataforma si fuera necesario.Esto hizo que la migración a plataformas de 64 bits fuera bastante sencilla.

Si busca tener componentes GUI, le sugeriría buscar kits de herramientas GUI como WxWindows o Qt (que son bibliotecas C++).

Otros consejos

Intente evitar los #ifdefs que dependen de la plataforma, ya que tienden a crecer exponencialmente cuando agrega nuevas plataformas.En su lugar, intente organizar sus archivos fuente como un árbol con código independiente de la plataforma en la raíz y código dependiente de la plataforma en las "hojas".Hay un buen libro sobre el tema, Gestión de código multiplataforma.El código de muestra que contiene puede parecer obsoleto, pero las ideas descritas en el libro siguen siendo brillantemente vitales.

Además de la respuesta de Kyle, recomiendo encarecidamente contra intentando utilizar el subsistema Posix en Windows.Se implementa a un nivel mínimo absoluto, de modo que Microsoft puede reclamar "soporte Posix" en una casilla de verificación de la hoja de características.Quizás alguien realmente lo use, pero nunca lo he encontrado en la vida real.

Ciertamente se puede escribir código C multiplataforma, sólo 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 que dependen del sistema en uno o varios módulos como máximo.Proporcione una interfaz independiente del sistema desde ese módulo.Luego construye 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 admiten 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 admiten 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 busca 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 pocos 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 su preocupación es cómo escribir aplicaciones que se puedan mover de una máquina a otra sin perder la configuración, 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 crear un binario de Linux entre distribuciones, POSIX/X11 de 32 bits probablemente sería la apuesta más segura.No estoy seguro de qué usa JungleDisk ya que actualmente estoy en una Mac.

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

1) simplista y gtk+

2) libcurl

3) libapr

Cubren casi todas las plataformas y, por lo tanto, son una herramienta extremadamente útil.

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

XVT tiene una API GUI C multiplataforma que tiene más de 15 años de antigüedad y se encuentra en la parte superior de los kits de herramientas de ventanas nativas. Consulte WWW.XVT.COM.

Admiten al menos LINUX, Windows y MAC.

También apoyo 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 entre sus plataformas y cómo podría abstraerlas.P.ej.Estas son algunas cosas relacionadas con el sistema operativo (p. ej.los molestos CR,CRLF,LF en archivos de texto), o cosas de hardware.P.ej.la compatibilidad posix mencionada anteriormente no le impide

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 utilizar funciones de conversión en algunas de las plataformas de destino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top