Question

Quelles sont les choses à garder à l’esprit lors de l’écriture d’applications multiplateformes en C ?Plateformes ciblées :PC, Mac et Linux basés sur Intel 32 bits.Je recherche particulièrement le type de polyvalence qu'offre Jungle Disk dans son édition de bureau USB ( http://www.jungledisk.com/desktop/download.aspx )

Quels sont les conseils et les pièges pour ce type de développement ?

Était-ce utile?

La solution

J'ai maintenu pendant plusieurs années une bibliothèque réseau ANSI C portée sur près de 30 systèmes d'exploitation et compilateurs différents.La bibliothèque n'avait aucun composant GUI, ce qui la rendait plus facile.Nous avons fini par extraire dans des fichiers sources dédiés toute routine qui n'était pas cohérente sur toutes les plates-formes et avons utilisé #defines le cas échéant dans ces fichiers sources.Cela a permis d'isoler le code ajusté par plate-forme de la logique métier principale de la bibliothèque.Nous avons également largement utilisé les typedefs et nos propres types dédiés afin de pouvoir les modifier facilement par plate-forme si nécessaire.Cela a rendu le portage vers les plates-formes 64 bits assez simple.

Si vous recherchez des composants GUI, je vous suggère de consulter des boîtes à outils GUI telles que WxWindows ou Qt (qui sont toutes deux des bibliothèques C++).

Autres conseils

Essayez d'éviter les #ifdefs dépendants de la plate-forme, car ils ont tendance à croître de façon exponentielle lorsque vous ajoutez de nouvelles plates-formes.Essayez plutôt d'organiser vos fichiers sources sous forme d'arborescence avec du code indépendant de la plate-forme à la racine et du code dépendant de la plate-forme sur les "feuilles".Il y a un joli livre sur le sujet, Gestion de code multiplateforme.L'exemple de code qu'il contient peut sembler obsolète, mais les idées décrites dans le livre sont toujours brillamment vitales.

Suite à la réponse de Kyle, je recommanderais fortement contre essayer d'utiliser le sous-système Posix sous Windows.Il est implémenté à un niveau minimum absolu, de sorte que Microsoft peut revendiquer le « support Posix » sur une case à cocher de la feuille de fonctionnalités.Peut-être que quelqu'un l'utilise réellement, mais je ne l'ai jamais rencontré dans la vraie vie.

On peut certainement écrire du code C multiplateforme, il suffit d'être conscient des différences entre les plateformes, et de tester, tester, tester.Les tests unitaires et une solution CI (intégration continue) contribueront grandement à garantir que votre programme fonctionne sur toutes vos plates-formes cibles.

Une bonne approche consiste à isoler les éléments dépendant du système dans un ou quelques modules au maximum.Fournissez une interface indépendante du système à partir de ce module.Ensuite, construisez tout le reste au-dessus de ce module, afin que cela ne dépende pas du système pour lequel vous compilez.

Essayez d'écrire autant que vous le pouvez avec POSIX.Mac et Linux prennent en charge POSIX de manière native et Windows dispose d'un système capable de l'exécuter (pour autant que je sache, je ne l'ai jamais utilisé).Si votre application est graphique, Mac et Linux prennent en charge les bibliothèques X11 (Linux nativement, Mac via X11.app) et il existe de nombreuses façons de faire fonctionner les applications X11 sous Windows.

Toutefois, si vous recherchez un véritable déploiement multiplateforme, vous devriez probablement passer à un langage tel que Java ou Python, capable d'exécuter le même programme sur plusieurs systèmes avec peu ou pas de modifications.

Modifier:Je viens de télécharger l'application et de regarder les fichiers.Il semble avoir des binaires pour les 3 plates-formes dans un seul répertoire.Si votre préoccupation concerne la façon d'écrire des applications pouvant être déplacées d'une machine à l'autre sans perdre les paramètres, vous devriez probablement écrire toute votre configuration dans un fichier dans le même répertoire que l'exécutable et ne pas toucher au registre Windows ni créer de répertoires de points dans le dossier personnel de l'utilisateur qui exécute le programme sous Linux ou Mac.Et en ce qui concerne la création d'un binaire Linux multidistribution, POSIX/X11 32 bits serait probablement le pari le plus sûr.Je ne suis pas sûr de ce que JungleDisk utilise car je suis actuellement sur un Mac.

Il existe très peu de bibliothèques portables, juste des exemples sur lesquels j'ai travaillé dans le passé

1) glib et gtk+

2) libcurl

3) libapr

Ceux-ci couvrent presque toutes les plates-formes et constituent donc un outil extrêmement utile.

Posix fonctionne bien sur Unice mais je doute que ce soit si génial sous Windows, en plus nous n'avons pas de matériel pour les interfaces graphiques portables.

XVT dispose d'une API GUI C multiplateforme qui est mature depuis plus de 15 ans et se situe au-dessus des kits d'outils de fenêtrage natifs. Voir WWW.XVT.COM.

Ils prennent en charge au moins LINUX, Windows et MAC.

J'appuie également la recommandation de séparer le code des différentes plates-formes en différents modules/arbres au lieu de ifdefs.

Je recommande également de vérifier au préalable quelles sont les différences entre vos plateformes et comment vous pouvez les résumer.Par exemple.il s'agit de éléments liés au système d'exploitation (par ex.les ennuyeux CR, CRLF, LF dans les fichiers texte), ou des trucs matériels.Par exemple.la compatibilité Posix mentionnée précédemment ne vous empêche pas de

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

Mais sur différentes plates-formes matérielles, la disposition de la mémoire interne peut être complètement différente (endianness), vous obligeant à utiliser des fonctions de conversion sur certaines des plates-formes cibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top