12
votes

Développement simultané C ++ sur Linux et Windows

Nous avons une poignée de développeurs travaillant sur une non-commerciale (lecture: juste pour le plaisir) Projet C ++ multiplate-forme. Nous avons déjà identifié toutes les bibliothèques inter-plateformes dont nous aurons besoin. Cependant, certains de nos développeurs préfèrent utiliser Microsoft Visual C ++ 2008, d'autres préfèrent que les EMACS se trouvent à GNU / Linux. Nous vous demandons si cela est possible pour nous tous travailler plus ou moins simultanément sur les deux environnements, à partir du même référentiel de code. En fin de compte, nous voulons que le projet compilait proprement sur les deux plates-formes dès le début.

L'un de nos développeurs est heureux de passer à l'autre environnement si cela n'est pas possible. Nous utilisons tous à la fois Linux et Windows sur une base régulière et profiter des deux, il ne s'agit donc pas d'essayer d'éduquer un seft sur les vertus de l'autre plate-forme. Il s'agit de chacun de nous étant capable de développer dans l'environnement que nous apprécions tout encore encore de collaborer sur un projet amusant.

Toute suggestion ou expériences à partager?


0 commentaires

13 Réponses :


15
votes

Utilisez CUKE pour gérer vos fichiers de construction.

Cela vous permettra de configurer un seul référentiel, avec un ensemble de fichiers texte. Chaque dev peut ensuite exécuter les scripts de cmake appropriés pour construire l'environnement de construction correct pour son système (Visual Studio 2008/2005 / GNU C ++ Construire des scripts / etc.).

Il y a beaucoup d'avantages ici:

  • Chaque dev peut utiliser son propre environnement de construction
  • Les dépendances peuvent être gérées très proprement, y compris la plate-forme de Depfs spécifiques.
  • Les constructions peuvent être hors source, ce qui aide à empêcher accidentellement des fichiers inappropriés
  • Migration facile vers un nouveau dev. Environnements (c'est-à-dire: lorsque vs 2010 est publié, certains devs peuvent migrer là-bas simplement en reconstruisant leur dossier de construction)

4 commentaires

J'aime cette suggestion, malgré mon dédain occasionnel de la syntaxe Makefile. Je prendrais cette étape supplémentaire (peut-être que c'est déjà implicite) et vous suggérez de configurer CI Constrations pour chaque plate-forme que vous ciblez. Cela vous permet d'identifier rapidement les changements de construction. Il existe de nombreux serveurs CI là-bas - j'ai utilisé Hudson à cet effet avec succès plusieurs fois.


Si vous utilisez CMAKE, il est très facile de l'intégrer avec Cadash - qui vous permet de faire CI ou de la nuit sur plusieurs plates-formes distribuées, et de donner une belle interface Web propre: CDASH.org


@MIKE: La syntaxe de Clake est également plus propre que la syntaxe de fabrication de maquillage, IMO - et élimine complètement tout besoin de toucher des maquillages - il les générera pour vous, si vous choisissez ce générateur (bien que j'utilise habituellement les générateurs ciblant des IDES)


Nous avons utilisé CMAKE pour ce type de développement pendant plus d'un an. C'est brillant. Je l'utilise pour le développement de Windows uniquement, la syntaxe est facile et il est beaucoup plus facile de refacturer votre structure de projet avec une cmake dans toutes les boîtes de dialogue dans VC ++. L'une de ses fonctionnalités les plus nucléaires est que vous pouvez abstraiter les chemins communs / chemins de liaison, les définitions de préprocesseur et les bibliothèques, elles sont donc spécifiées à un endroit pour tous les projets de la solution. Ensuite, la modification de l'une d'entre elles devient facile, plus de modification de 20 fichiers de projet avec un éditeur de texte.



2
votes

Le problème ne modifie pas vraiment les fichiers source C ++, mais le processus de construction lui-même. Vs n'utilise pas la même architecture de Makefile que le développement Linux le fait généralement. Une suggestion radicale, mais les deux groupes pourraient en réalité utiliser le même processus d'IDE C ++ et de construction - voir code :: blocks Pour plus d'informations.


3 commentaires

Mais cela peut faire: créer un projet de makefile, et il exécutera une ligne de commande que vous voudriez (pas seulement NMake, bien que ce soit la valeur par défaut).


Je ne pense pas que les gens céderaient cela si facilement, comme pour certaines personnes, le choix de l'éditeur semble avoir la même importance que, par exemple, le choix de la religion. Ce problème a suscité des guerres virtuelles sur les internets, alors veuillez vous soucier de ce que vous suggérez! Nous ne voulons pas avoir le culte de VI mars contre l'église d'Emacs! (Bien que nous sachions que le culte vaincre facilement l'église) PS: Ne prenez pas cela trop sérieux, gardez simplement à l'esprit que la plupart des développeurs n'abandonneront pas leurs éditeurs bien-aimés qui sont faciles :)


Eh bien, la suggestion n'était pas si sérieuse - je sais ce que sont les utilisateurs d'Emacs :-)



2
votes

Ceci est possible (je fais cela pour gagner mon argent quotidien :-)).

Mais vous devez garder à l'esprit les différences dans les bibliothèques fournies par le système d'exploitation qui pourraient être très ennuyeuses. Deux bonnes options pour se déplacer qui sont boost et qt.

Vous fournissez les deux avec des fonctions indépendantes de la plate-forme de substances utiles qui ne sont pas traitées par le C Lib et la STL.


0 commentaires

3
votes

J'utilise personnellement CMAKE / MINGW32 / QT4 pour tous mes besoins de mon C ++. QTCreator est une IDE crossplateform qui est quelque peu optimisée pour la programmation QT4.


0 commentaires

12
votes

Je l'ai fait et je l'ai vu fait sans trop de problèmes.

Vous voudrez essayer d'isoler le code différent pour les différentes plates-formes. De plus, vous voudrez réfléchir à votre Structure de répertoires . Quelque chose comme

  • Projet / SRC <- .CC et .H Fichiers
  • Projet / SRC / Linux | Gagnez <- code spécifique à une plate-forme ou à l'autre
  • Project / Linux <- Faites des fichiers et autres éléments liés au projet
  • Projet / Win <- .sln et .CSPROJ Fichiers

    Fondamentalement, vous voulez juste être vraiment clair ce qui est spécifique à chaque système et ce qui est courant.

    Aussi, tests unitaires va être vraiment important car il peut y avoir une différence mineure et que vous souhaitez faciliter la gestion des tests pour que le code Linux fonctionne comme prévu. et l'inverse.


1 commentaires

Aussi +1 pour les tests d'unités. Notez que cela signifie que vous devez vous assurer que votre framework de test unitaire est également multiplate-forme - évitez le nouveau cadre de test de l'unité C ++ intégré à VS2012, par exemple.



2
votes

Je l'ai fait de deux manières:

  1. Chaque plate-forme a son propre système de construction. Chaque fois que quelqu'un change quelque chose (ajout d'un fichier source), ils adaptent également l'autre plate-forme, soit une notification d'une notification et une personne plus familière avec l'autre plate-forme l'adapte en conséquence.
  2. Utilisez CMAKE .

    Je ne peux pas dire que j'ai vraiment aimé Clake, mais un outil multi-plate-forme a certainement ses avantages.

    Généralement, en utilisant différents compilateurs pour compiler votre code à partir des toutes premières lignes, c'est toujours une bonne idée, car elle aide à améliorer la qualité du code.


0 commentaires

4
votes

J'ai eu une telle expérience de travail à Acronis. Nous avons eu le même codebase utilisé pour construire des fichiers binaires (installateurs entièrement emballés, réellement ciblant Win32 / 64, Linux et OS X (et un groupe d'autres plates-formes plus exotiques, telles que l'EFI), avec tout le monde travaillant dans leur IDE de choix. L'astuce ici consiste ici à éviter des solutions spécifiques à compilateur et à l'IDE et à rendre votre projet entièrement construisable à partir de plate-forme croisée propre à créer des fichiers. Notez que vous pouvez parfaitement utiliser n'importe quel système de fabrication avec VC ++, ce n'est donc pas un problème (nous avons utilisé Watcom faire pour des raisons historiques, mais je ne le recommanderais pas).

Une autre chose que vous puissiez faire est d'ajouter un script de fabrication qui produit automatiquement des fichiers de projet dans les listes d'entrée de vos maquillages, pour tous les IDES que vous utilisez (E.G. VS et ECLIPSE CDT). De cette façon, chaque développeur génère ce genre de choses pour lui-même, puis ouvre ces projets en IDE à éditer / construire / déboguer, mais le référentiel source n'a que des fabricants de fabrication.

S'assurer que le code est compilable pour tout le monde peut être un problème, principalement parce que VC ++ est généralement plus lax en appliquant les règles que g ++ (par exemple, il vous permettra de lier une ruerve à une référence non constituée, bien qu'avec un avertissement. ). Si vous compilez avec des avertissements de traite comme des erreurs et des niveaux d'alerte les plus élevés (avec peut-être quelques avertissements choisis à la main désactivé), vous éviterez la plupart du temps à cela. Avoir une installation de construction de roulement contiguë est une autre façon d'attraper ces premiers. Une autre approche que nous avons utilisée dans Acronis est de disposer de l'environnement Windows Building dispose d'outils de compilation croisée à base de cygwin, de sorte que tout windows Dev pourrait faire une cible de cible de construction (avec la même version g ++ et tout) de sa boîte, et voir si cela échoue, pour vérifier que ses modifications compileront en G ++.


0 commentaires

5
votes

Comme mentionné dans les messages précédents, QT est une méthode très facile pour faire un véritable développement multi-plateformes simultané - indépendamment de votre IDE et avec de nombreux compilateurs différents (même pour Symbian, bras, Windows CE / Mobile ...). < / p>

Dans ma dernière et la société actuelle, je travaille dans des équipes mixtes de développeur de Linux et de Windows, qui travaillent ensemble à l'aide de Subversion et de Qt (qui possède un système de construction très simple et puissant "QMake", qui cache toutes les différentes plate-forme / Environnements de construction spécifiques au compilateur - Vous devez simplement écrire un fichier de construction pour toutes les plates-formes - si facile!).

et: QT contient presque tout ce dont vous avez besoin:

  • Manipulation à chaîne simple, avec prise en charge de la traduction facile et conversion facile à chaînes (UTF8, UTF16, ASCI ...)
  • CLASSES SIMPLES POUR FICHIER E / S, Images, Networking, etc.
  • Cours d'interface graphique confortable
  • Designer graphique pour la mise en page d'interface graphique / design
  • outil de traduction graphique pour créer des traductions dynamiques pour vos applications (vous pouvez exécuter un binaire avec différentes langues sélectionnables - même les polices asiatiques, les polices asiatiques ...)
  • Cadre de test intégré (Tests unitaires)

    Qt est donc un environnement complet et très fiable - je l'utilise depuis 10 ans.

    et: QT s'intègre de manière transparente dans les IDes comme VC ++, Eclipse ou fournit à son propre IDE "QTCreator".

    Voir: http://www.trolltech.com + http://doc.trolltech.com

    meilleures salutations, Chris


0 commentaires

2
votes

Un autre vote pour CMAKE.
Une chose à surveiller, les noms de fichiers sont en chambré mais pas sensible à la casse sur Windows. Ils sont sensibles à la caisse sur la plupart des systèmes de fichiers UNIX.

C'est généralement un problème avec #include

par exemple. Compte tenu d'un fichier foobar.h xxx


0 commentaires

1
votes

Je suis d'accord avec tout le monde ici qui a suggéré Cumake pour le développement de la plateforme croisée en C ++. C'est un excellent outil.

Une autre chose que je suggérerais, c'est d'utiliser Eclipse CDT comme environnement de développement. Cela fonctionne dans n'importe quel endroit où vous pouvez exécuter Java un GCC et qui unifie votre environnement de développement.

Je pense que c'était Alan Jackson qui a mis l'accent sur le test de l'unité. Pour ce faire, vous auriez besoin de certaines bibliothèques de test d'unité multiplate-forme. J'ai lu cette POST Il y a longtemps concernant les cadres de test unitaires C ++. C'est un peu obsolète mais réfléchi. Celui qui manque également dans les deux plateformes est Googletest .

Enfin, si vous souhaitez exécuter ces tests automatiquement dans les deux plates-formes CMAKE, un autre outil appelé ctest est très bon pour le faire.


0 commentaires

3
votes

Nous travaillons également sur un projet multi-plateformes. Nous utilisons EMACS pour coder, SCONS pour construire et Visual Studio 2008 pour déboguer. C'est mon 1ère fois en utilisant Emacs + Swons et je dois dire que c'est très très astucieux une fois que vous avez compris comment fonctionne les sconstriques et les sconscripts.


0 commentaires

3
votes

Je suis en retard sur cette question et il y a beaucoup de bonnes réponses ici, mais je n'ai vu personne énumérer toutes les questions que j'ai rencontrées (la plupart de mes travaux en C ++ sont et ont été croisés. plate-forme), donc:

  • Compilation multiplate-forme. Tout le monde a couvert cela assez bien. CMAKE et Scons sont utiles entre autres.
  • Différences de plate-forme. Celles-ci ne sont pas réellement limitées à Linux V Windows. Différentes versions de Windows ont beaucoup de problèmes subtils. Si vous souhaitez jamais sauter de Linux à OS X, vous trouverez la même chose. Ainsi, les différences d'architecture du processeur: 32 V 64 bit ne comptent généralement pas - jusqu'à ce que cela ne vous associe pas très mal. C'est quelque chose que les programmeurs C ++ font face à plus que dans la plupart des autres langues, dont les implémentations travaillent fort pour cacher ce type de chose à partir de programmeurs.
  • testez tout . Alan Mention des tests de l'unité mais laissez-moi les insister. Le vrai problème avec la programmation croisée n'est pas un code qui ne compilera pas: c'est un code qui compile tout simplement bien et qui fait la mauvaise chose dans des cas subtiles. Les tests de l'unité importent ici beaucoup plus que lorsque vous travaillez sur une seule plate-forme.
  • Utilisez des bibliothèques portables dans la mesure du possible. Obtenir ce droit est plein de gotchas subtils. Il vaut mieux tirer parti du travail de quelqu'un d'autre que de rouler le vôtre. QT est utile ici, de même que NSPR et avr. (ces deux derniers sont c , mais des wrappers existent si vous ne voulez pas gâcher directement avec eux.) Ce sont les bibliothèques qui ciblent explicitement l'abstraction de la plate-forme comme objectif, mais la plupart des autres bibliothèques que vous utilisez doivent être vérifiées pour cela. Être raisonnablement méfiant des bibliothèques cool qui n'ont pas de trace de la portabilité. Je ne dis pas ne les utilisez pas: Testez simplement d'abord. Faire ce droit vous permet d'économiser d'énormes efforts sur les tests.
  • pavel mentionne l'intégration continue . Cela peut ne pas comporter s'il n'y a qu'une poignée de vous. Mais j'ai constaté que le nombre de plates-formes que vous obtenez lorsque vous considérez que tous les différences de système d'exploitation, de système d'exploitation et de processeur signifient que, sans une forme de cycle de test de construction continu, vous manquerez toujours un cas de bord. Si votre projet devient plus grand qu'une poignée de personnes considérons cela.
  • Contrôle de la version. La question la plus évidente est la manipulation de nouvelles lignes et de la sensibilité au nom de fichier, mais il y en a d'autres. La majeure partie de la Source Open Source bien connue fait cela à l'heure actuelle, mais il est remarquable qu'il leur faut habituellement plusieurs années pour trouver tous leurs bugs liés à la portabilité. À titre d'exemple, Mercurial, qui a eu une portabilité comme l'un de ses points de vente, présente une série de correctifs couvrant trois ou quatre libérations traitant des noms de fichiers Windows dans des situations peu communes. Assurez-vous de pouvoir vérifier ce que les autres vérifient tôt.
  • scripts. Utilisez Perl / Python / Ruby (ou quelque chose comme eux) pour votre script. Essayer de garder la coque Linux et les scripts de lots de Windows en synchronisation sont douloureusement fastidieux.

    Malgré tout ce qui précède: une plate-forme inter-plate-forme globale est assez faisable et il n'y a pas de vraie raison de l'éviter. Mon expérience est que les problèmes tendent à contourner de manière sporadique, mais quand ils prennent plus de temps de temps. Si vous programmez un moment, mais vous ne trouvez pas cet inhabituel.


0 commentaires

0
votes

Découvrez Premake Premake ... il est assez similaire à cmake mais écrit à l'aide de Lua.

J'en ai utilisé cela sur un certain nombre de projets de développement et je trouve facile d'apprendre et d'intégrer et d'intégrer dans les structures de la société et des projets existantes.

Essayez!

http://industriousone.com/premake


0 commentaires