IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Compilation multi plateforme


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut Compilation multi plateforme
    Bonjour,

    Je réapprends depuis le début ce langage que je n'ai plus touché depuis très très longtemps !

    Pour bien commencer, j'aimerais avoir des indications pour que mes programmes soient compilable multi-plateforme (Linux, Windows, Mac)

    J'utilise principalement CodeBlocks, VCS2008 et Cygwin

    Si vous avez des tutos qui décrivent comment faire du compilable multi-plateforme, ce serait intéressant.

    Merci et bonne année 2010 @ tous !

  2. #2
    Membre émérite Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 047
    Points : 2 254
    Points
    2 254
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <iostream>
    #if defined(_WIN32)
     
    int main()
    {
        std::cout << "Windows";
        return 0;
    }
    #elif(UNIX)
     
    int main()
    {
        std::cout << "Unix";
        return 0;
    }
    #elif(__CYGWIN__)
     
    int main()
    {
        std::cout << "Cygwin";
        return 0;
    }
     
    #else
     
    int main()
    {
        cout << "Inconnu";
        return 0;
    }
     
    #endif
    Ceci te conviendrais?

  3. #3
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut
    Merci Astraya,

    Cela me convient, il ne me reste plus qu'à voir les différences entre chaque système pour que la compilation s'effectue sans problème suivant le système utilisé.

    Pour information, je voudrais faire une petite application client/serveur de test, bref un hello world like !

    Je voudrais donc compiler le client/serveur sur chaque système, sachant que le C/S ne seront pas forcément sur le même système, par exemple Mac/Windows ou Unix/Mac

    Le tout est de faire mes futures applications multi-plateforme et donc d'avoir un gabarit C++ pour cette seule fonction.

    Merci.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Soit tu te fais de la compilation conditionnelle plus ou moins à outrance, soit tu n'utilises QUE des fonctions standard C/C++ (=> exit le multithread), soit tu utilises une librairie d'abstraction qui effectue déjà la tripaille à ta place.

    Une chance pour toi, les sockets BSD font justement partie des fonctions portables, donc tu peux tout à fait (aux inclusions d'entêtes près) avoir un programme identique et sans compilation conditionnelle sur toutes les plate-formes possibles. Pour aller plus loin, ou plus simplement si tu préfères, tu peux utiliser des librairies comme ACE, POCO, ICE et dans une certaine mesure Boost. Si tu comptes aller plus loin dans le domaine des applications portables, je ne saurais trop te conseiller d'aller directement sur une librairie d'abstraction et de t'épargner la phase "barbare" consistant à le faire à la main... Mes préférences vont à POCO pour l'aspect système, et à ICE pour l'aspect réseau. ACE fait les deux, mais je trouve cette librairie franchement mal foutue et mal documentée, mais sa portabilité est supérieure à celle des deux autres.
    Boost est également très portable, mais guère plus que POCO / ICE en fait. Par contre, elle colle parfaitement à l'esprit de la STL, ce qui peut être un avantage ou un inconvénient suivant tes préférences personnelles.

    Attention aussi à penser à gérer l'endianness, l'alignement (et donc la taille des mots-machine) et la sérialisation de façon générale si tu veux réellement quelque chose qui soit absolument et totalement portable. Mais dans un premier temps, tu peux t'épargner ce chapitre.

  5. #5
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut
    Merci Mac LAK,

    En effet je me souviens vaguement avoir testé ICE il y a un moment, et en effet la solution d'une librairie est la meilleure, me permettant ainsi de gagner du temps pour parfaire le codage plutôt plutôt que de faire de la compilation conditionnelle...

    Je testerai Boost étant donné que je m'oriente plutôt STL aussi !
    Tant qu'à faire de tout reprendre à zéro, autant le faire bien

    Merci et bonne année !

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    S'il s'agit de faire des applications avec IHM et tout le toutim, tu as aussi des framework multiplateformes comme Qt ou wxWidgets.

  7. #7
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut
    Pour l'IHM, ce sera en effet wxWidgets (je le préfère aux autres), mais pour l'instant je reprends tout mon apprentissage de zéro (ça fait un moment que j'ai plus touché au C et C++), donc wxWidgets sera pour plus tard.

    De toute façon au niveau du serveur, je n'ai pas trop besoin d'IHM, et à la rigueur comme les données sont sur BDD (MySQL, PostgreSQL, BerkeleyDB ou fichier XML), une interface web (via PHP) pourrait amplement faire l'affaire.

    Merci.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Salut,

    pour le multi-plateforme

    Il te suffit de repérer les fonction que tu utilise et qui ne le sont pas.
    Comme pour les Sockets ou les threads.
    Mais tu peut trouver des lib comme la lib BOOST ou Qt ... qui sont déjà multi-plateforme.

    ensuite il faut que tu repère les types qui peuvent différer entre les archi
    comme par exemple le type SOCKET sous windows.
    la tu peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      ifndef _WIN32
        // hors windows
        typedef SOCKET int;
      endif
    comme sa tu peut re-typer en fonction de tes besoins et faciliter le prototypage de tes fonctions/methodes
    tu as aussi le principe de lib dynamique et interface(class abstraite)

    comme sa tu peut utiliser un "factory method" et créer une class en fonction de ton archi et pour ton code tu utilise l'interface qui elle va appeler la méthode en fonction de la classe fille et donc en fonction de ton archi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    #ifdef _WIN32
       Class* getClass()
       {
          return new ClassWin();
       }
     
    #else
       Class* getClass()
       {
          return new ClassUnix();
       }
    #endif
     
    class Class
    {
    public:
        virtual void Sys() = 0;
    };
     
    class ClassUnix
    {
         public:
           void Sys()
          {
            std::cout << "unix" << std::endl;
          }
    };
     
    class ClassWin
    {
         public:
           void Sys()
          {
            std::cout << "Windows" << std::endl;
          }
    };
     
    main()
    {
       Class* = getClass();
       Class->Sys();
    }
    ce boup de code et en C++ j'espere que sa peut t'aider :/

  9. #9
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut
    Merci Jouana,

    Ce peut en effet être pratique, mis le conditionnel reste agréable pour des petits projets.

    Si on prend le cas d'un gros projet, type OpenOffice, Thunderbird ou un jeu alors utiliser le conditionnel risquerait d'augmenter les possibilités d'erreur, non ?

    Merci.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bah dans le cas du multi-archi tu n'as pas beaucoup le choix.

    Mais le mieux après ces de faire des librairies qui vont contenir tes class tes methodes et tes fonction spécialiser en fonction de l'architecture comme ça tu peu réduire le conditionnel même le faire disparaitre.

    Moi j'utilise les deux la lib et le conditionnel sa m'évite d'avoir plein de source et le tous compile partout.

    Tu as aussi des choses a revoir au niveaux de tes Makefile

    la commande gcc ou make sous unix-like peuvent être différents suivant les systèmes.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Points : 75
    Points
    75
    Par défaut
    Je complète la discussion sur le multi-plateforme non pas au niveau du code mais au niveau de la gestion des projets (Visual Studio, CodeBlocks, ...) qui peut rapidement devenir un enfer.
    Un programme bien pratique pour cela : Premake qui génère les projets selon une simple description. Très pratique.

  12. #12
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 263
    Points : 333
    Points
    333
    Par défaut
    Merci KorWipte, je ne le connaissais pas et en effet il peut être très pratique...

    Programme à suivre de près !

  13. #13
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Pour les projets / makefiles, tu as aussi CMake qui peut te rendre service.

    Pour le mix CC / librairie portable, c'est quand même assez souvent un nid à emm.... et une cause de régressions bien pénibles à gérer (cas vécu au quotidien, hélas, merci le "passif" de certaines applications...).

    Si tu utilises une librairie de portage, je conseille quand même fortement de limiter la CC à deux cas et deux cas SEULEMENT :
    • Un unique fichier / module d'adaptation qui contient toutes les variations entre plate-formes, ces variations ne devant JAMAIS apparaître ailleurs dans le code.
    • La création de stubs à des fins de tests unitaires.
    En dehors de ces deux cas, et SI tu utilises une librairie d'abstraction / portage, alors tout code conditionnel est une erreur de conception.

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par Mac LAK Voir le message
    Pour les projets / makefiles, tu as aussi CMake qui peut te rendre service.
    Tu peux trouver un tutoriel sur CMake ici : Introduction au système de construction logicielle CMake, par Florian Goujeon
    Citation Envoyé par Mac LAK Voir le message
    En dehors de ces deux cas, et SI tu utilises une librairie d'abstraction / portage, alors tout code conditionnel est une erreur de conception.
    ++

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    La création de stubs à des fins de tests unitaires
    Pour cela, j'utilise une librairie fort pratique Amop que je ne peux que vivement conseiller. Plus aucune excuse pour éviter de créer des stubs pour les tests unitaires

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] [Mac OS X] Installation et compilation multi-plateforme
    Par arkhamon dans le forum Lazarus
    Réponses: 1
    Dernier message: 29/02/2012, 19h53
  2. Apprendre un langage compilé "multi-plateforme" et "multi-purpose"
    Par Autodidacte xp dans le forum Langages de programmation
    Réponses: 34
    Dernier message: 15/12/2011, 19h38
  3. Compilation multi-plateforme et bibliothèque
    Par Leeelooo dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 09/05/2007, 12h35
  4. Outils de développement multiplateforme
    Par jibe74 dans le forum Outils pour C & C++
    Réponses: 27
    Dernier message: 30/10/2006, 01h04
  5. Quel lg et IDE pour dev 1 appli multi-plateformes?
    Par Langelot dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 04/02/2005, 00h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo