Je terminais l'un de mes premiers projets C ++ qui est (selon le cadre) censé être multiplateforme. J'ai développé le projet entièrement dans Windows et Visual Studio, pensant que puisque les bibliothèques sont toutes multiplates-formes, faire la construction OSX "plus tard" serait trivial. Cela ne s'est pas avéré être le cas, mais le "code Windows" ne fonctionne pas correctement et a dû corriger quelques erreurs de compilation.
Quelles techniques existent pour s'assurer au préalable que le code est compatible avec toutes les plateformes? Développer toutes les plates-formes simultanément, testant ainsi le code contre chaque plate-forme en même temps, lorsque de nouvelles fonctionnalités sont ajoutées, plutôt que de développer les différentes versions de plate-forme les unes après les autres? (*)
En regardant spécifiquement, cela ne dépend pas des outils, mais plutôt des «processus de développement» qui aident à la compatibilité entre plates-formes, quels que soient les outils utilisés. Comme celui (*) ci-dessus.
Plus précisément, je développe un plug-in VST avec WDL-OL ( https://github.com/olilarkin/wdl-ol ) et quelques bibliothèques DSP multiplateformes. Les projets WDL-OL ont des projets VS et Xcode mis en place, mais je suppose que les problèmes viennent des bibliothèques, puis des différences dans les compilateurs.
la source
Réponses:
La création de code portable peut être très difficile.
D'abord quelques conseils liés au langage:
Ensuite, quelques recommandations de conception:
Enfin les points délicats:
TCHAR
), mais cela peut alors être difficile en combinaison avec la bibliothèque standard (par exemplecout
vswcout
à utiliser selon l'utilisation dechar
ouwchar_t
)Mais ce ne sont que des conseils. Dans ce domaine, vous ne pouvez pas gagner en certitude.
la source
-Wall -Wextra -Werror
-pedantic
.Il n'y a rien qui puisse garantir que le code est compatible avec une plate-forme autre que le construire, l'exécuter et le tester là-bas. Par conséquent, l'approche de toutes les personnes sensées consiste à créer, exécuter et tester leur application sur chaque plate-forme sur laquelle ils projettent qu'elle devra être construite, exécutée et testée.
L'intégration continue (CI) peut alléger un peu ce fardeau pour les petits projets, car vous pouvez obtenir des agents de construction bon marché ou gratuits pour certaines plates-formes (principalement Linux), faire votre développement sur Windows et simplement retourner à Linux en cas de problème.
OSX CI est cependant assez délicat.
la source
Si vous demandez des "processus de développement" et que votre plate-forme de développement principale est Windows avec Visual Studio, je vous suggère d'essayer de créer votre projet sans "windows.h" inclus. Vous obtiendrez beaucoup d'erreurs de compilation qui vous dirigeront vers de nombreux endroits où vous devrez refactoriser votre code. Par exemple, 'DWORD' ne sera pas # défini et vous devrez le remplacer par
uint32_t
partout (google forstdint.h
et vous trouverez des informations utiles sur les types entiers et leurs définitions multiplateformes). Ensuite, vous devrez remplacer tous les appels à l'API Win32, tels que,Sleep()
avec leur équivalent multiplateforme (encore une fois, Google est votre meilleur ami, qui affichera les questions et réponses pertinentes dans les sites stack * .com). Vous ne réussirez probablement pas à trouver tous les remplacements multiplateformes pertinents pour votre code et vous devrez renvoyer votreinclude "windows."
directive mais la mettre sous#ifdef _WIN32
- plus de détails iciContinuez à poser des questions plus concrètes et à obtenir des réponses - c'est une suggestion générale pour «ce qui devrait être le processus de développement»
EDIT 1 Une autre de mes suggestions est d'utiliser gcc et / ou clang sur votre machine de développement Windows (avec Visual Studio)
la source
Cela dépend des "quelques erreurs de compilation" que vous mentionnez. Sans savoir ce qu'ils étaient, il est impossible d'être précis.
J'ai du code multiplateforme pour Windows / Linux / iOS / Android / Mac. Chaque nouvelle plate-forme a généré des erreurs et des avertissements supplémentaires lors de son ajout. Vous apprendrez rapidement quelles constructions posent des problèmes. Soit les éviter, soit résumer les différences dans un en-tête avec
#ifdef
s. N'essayez jamais de#ifdef
passer d'une plate-forme à l'autre dans votre code.Un exemple:
crée une instance temporaire
MyClass
qui est supprimée aprèsmyfunction
son retour. Avec certains de mes compilateurs C ++, cette instance est en lecture / écriture (et le fait qu'elle soit temporaire et sera bientôt détruite n'inquiète pas le compilateur). Avec d'autres,myfunction
doit être redéfini pour prendre unconst MyClass &
, ou le compilateur se plaint. Peu importe ce que dit la norme C ++, ou quel compilateur a raison et lequel est faux. Après avoir rencontré l'erreur deux ou trois fois je sais que (a) soit déclarer une variable temporaire de typeMyClass
et que passer àmyfunction
ou (b) déclarer la référenceconst
dansmyfunction
et d' utilisermutable
ici et là pour deconstify.Conclusion: accumulez de l'expérience et développez vos propres normes de codage.
la source
Un moyen possible d'aider la portabilité pourrait être de s'appuyer uniquement sur les déclarations et les fonctionnalités fournies par la norme C ++ 11 , et en utilisant des bibliothèques et des cadres multiplateformes comme POCO & Qt .
Mais même cela n'est pas infaillible. Rappelez-vous l'aphorisme
Avec de la pratique, de la discipline et beaucoup d'expérience, le portage d'un programme vers une autre plateforme peut généralement se faire rapidement. Mais l'expérience et le savoir-faire comptent beaucoup.
la source