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

Choisir un environnement de développement Discussion :

Compiler un même projet sous plusieurs OS


Sujet :

Choisir un environnement de développement

  1. #1
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut Compiler un même projet sous plusieurs OS
    Bonjour,

    je dois effectuer le portage vers Windows d'une application initialement développée sous Linux.

    Il n'y a pas beaucoup de code à porter, donc qu'on souhaiterait n'avoir qu'un seul projet pour les deux versions.

    L'idée serait d'avoir en gros ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void mafonction(){
     
    /* code à pas porter*/
    ....
    /* fin code à pas porter */
    #IF_DEF WINDOWS
    /* blabla code windows qui passe pas sous linux */
    #END_IF
    #IF_DEF LINUX
    /* blabla code linux qui fait pareil mais sous linux 
    et marche pas sous windows sinon ça serait trop simple */
    #END_IF
    }
    Jusque là c'est pas trop compliqué, il faut définir une variable.

    On souhaiterait pouvoir utiliser les même makefile pour les deux versions, et définir les variable WINDOWS ou LINUX dedans, et ce automatiquement.

    Comme ça, sous windows ou sous linux, un simple "make" suffit à compiler le projet. Eventuellement on pourrait passer une option à ce moment là ("make windows" ou "make linux") pour définir le système sur lequel on travaille, mais si ça peut être automatisé, c'est mieux.

    Comment faire, et y a t'il des conventions de nommage (officielles ou officieuses) dans ces cas là ?

    Je vais utiliser CMake et MingW.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Sauf exception, inutile de se prendre la tête dans la configuration des Makefiles pour compiler en fonction d'une plateforme. Un certain nombre de symboles sont déjà prédéfinis.

    Sous Linux, il s'agit de linux ou __linux. De manière plus général sous UNIX, il y a __unix. Sous Windows, il s'agit de _WIN32 ou _WIN64.

    Ne pas oublier que les compilateurs prédéfinissent aussi leurs symboles. GCC prédéfinit __GNUC__, MinGW __MINGW32__ et Visual _MSC_VER.

    Voici ce que devient ton exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void mafonction(){
     
    /* code à pas porter*/
    ....
    /* fin code à pas porter */
    #if defined (_WIN32)
    /* blabla code windows qui passe pas sous linux */
    #elif defined (linux) || defined (__linux)
    /* blabla code linux qui fait pareil mais sous linux 
    et marche pas sous windows sinon ça serait trop simple */
    #endif
    }

    Bien entendu, CMake définit ses propres variables : UNIX, WIN32, MINGW, MSVC avec toute une collection pour les différentes versions de Visual, CMAKE_COMPILER_IS_GNUCC pour GCC.

    Ca peut être utile pour compiler un fichier uniquement sur l'une des plateformes. Voir http://www.cmake.org/Wiki/CMake_Useful_Variables.


    Enfin, il existe une toute autre façon de faire avec CMake, souvent utile pour savoir si tel ou tel include est présent sur la plateforme.
    Voir http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks

  3. #3
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Pour information, ça donne ça dans le code final
    (mingw redéfinit mkdir, avec seulement 1 paramètre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #if defined(__MINGW__) || defined(__MINGW32__)
    	if(mkdir(&path.toString()) < 0)
    		throw SystemException(errno, "file");
    #else
    	if(mkdir(&path.toString(), 0777) < 0)
    		throw SystemException(errno, "file");
    #endif
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

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

Discussions similaires

  1. Compilation d'un projet sous Mac OS X 10.8
    Par csluikidikilest dans le forum Débuter
    Réponses: 0
    Dernier message: 12/01/2013, 05h58
  2. Réponses: 3
    Dernier message: 09/12/2010, 00h11
  3. [Sonar] Intégration de deux version du même projet sous MAVEN
    Par woodwai dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 21/12/2009, 13h27
  4. Réponses: 5
    Dernier message: 07/09/2004, 17h38
  5. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39

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