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 :

Makefile 2 systemes


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut Makefile 2 systemes
    Bonjour a tous,
    J'ai un programme que je voudrais faire marcher sous linux et sous sun, evideemment j'ai des procedures qui ne marchent que sur sun car utilisent des biblioteques de sun et d'autres qui ne marchent que sous linux utilisant les biblioteques de Linux. j'ai un Makefile qui permet de lancer le Programme soit sur linux ou sur sun, mais mon probleme est le suivant je ne voudrais pas dupliquer toutes les procedures en dehors de celles qui sont purement linux ou sun.
    on m'a propose une idee a savoir utilise ifdef que j'utilise comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef Linux
    #include "aFDPR_l.h"
    #endif
     
    #ifdef Linux
    #include "aFDPR_s.h"
    #endif
    ce qui ne marche pas car j'obtient des erreurs du genre type incomplet

    en fait je voudrais que le compilateur reconnaisse a quel moment utiliser aFDPR_l pour linux ou aFDPR_s pour sun
    merci de me proposer des solutions

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    Il n'y aucun rapport avec un makefile. Je veux dire tel que tu présentes le problème, il s'agit juste d'inclure un fichier à la compilation. Le makefile ne sert qu'a lancer cette compilation.

    Suis je clair ... ?. lol

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Tu ne peux pas créer un autre fichier d'entête :

    aFDPR.h et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    aFDPR.h :
     
    #ifdef LINUX
    #include "aFDPR_l.h"
    #else
    #ifdef SOLARIS
    #include "aFDPR_s.h"
    #else
     // sinonn, quoi faire ! du style
    #error "Impossible de compiler sur cet OS"
     
    #endif
    #endif
    Comme ça, partout, tu inclues juste aFDR.h, et tu compiles avec -DLINUX ou -DSOLARIS suivant le système (il y a même des expressions déjà définis lorsque l'on compile sur un certain OS, mais je ne connais pas leur nom) (étant donné que je n'ai jamais eu le cas là )

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    M'est avis que les autotools seront tes amis -- les bibliothèques portables aussi.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut
    je vais essayer d'etre un plus explicite, en effet j'ai les fichiers suivants:
    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
     
    aFDR_l.h
    aFDR_l.C  // qui contient
      #include "aFDR_l.h"
     
    aFDR_s.h
    aFDR_s.C  // qui contient
      #include "aFDR_s.h"
    main.C   // qui contient
    #ifdef Linux
    #include "aFDPR_l.h"
    #else
    #ifdef SunOS
    #include "aFDPR_s.h"
    #else
     // sinonn, quoi faire ! du style
    #error "Impossible de compiler sur cet OS"
     
    #endif
    #endif
    // comme milli
    et j'ai le makefile suivant
    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
     
    Makefile:
     
    SHELL = /bin/sh
    OS_TYPE := $(shell uname -s)
    SERVER_NAME := $(shell uname -n)
    PLATFORM := $(shell uname -i)
    .....
     
    ifeq ($(OS_TYPE), SunOS)
       // compil sun version
    endif
     
    ifeq ($(OS_TYPE), Linux)
       // compil Linux version
    endif
    ...
    ....
    lorsque je lance ce Makefile avec 2 main a savoir main_l.C qui contient #include"aFDR_l.h" et main_s.C qui contient #include"aFDR_s.h" il fonctionne sans probleme mais lorsque j'utilise un main.C comme plus haut ca ne marche plus et la est ma question comment le faire avec un main qui peut choisir l'un des 2 include suivant le OS
    merci de me repondre

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tu ferais mieux au niveau de ton main de n'avoir qu'un seul include, mais de compiler un .cpp ou l'autre en fonction de ta plateforme cible -- je suppose que tes fonctions linux/solaris sont interchageables entre elles (si on s'en tient à leur rôle).
    Bref. Encapsule.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Luc Hermitte
    Tu ferais mieux au niveau de ton main de n'avoir qu'un seul include, mais de compiler un .cpp ou l'autre en fonction de ta plateforme cible
    Je plussoies, c'est ce que je t'avais dit, tu peux voir que dans j'ai crée un nouveau .h qui s'appelle aFDPR.h, ça te permet donc d'utiliser ta bibliothèque de fonction partout sans avoir à faire des #ifdef partout.



    Sinon, quelles sont les fonctions que tu fais qui sont non compatibles ?

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ce que je propose est "pire" que ça => 0 #ifdef
    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
    // interface.h
    ... gardes anti-reincl
    void f(Param p);
     
    // interface-linux.cpp
    #include "interface.h"
    #include "API-linux.h"
     
    void f(Param p) {
       function_specifique_linux(p.getToto());
    }
     
    // interface-solaris.cpp
    #include "interface.h"
    #include "API-solaris.h"
     
    void f(Param p) {
       function_specifique_solaris(p.getTiti());
    }
     
    // toto.cpp
    #include "interface.h"
    ...
    { .....
        f(p);
    Faut-il encore qu'il y ait une sorte de polymorphisme qui puisse être mis en place pour utiliser l'API linux ou l'API solaris ; i.e. qu'elles servent à résoudre un même problème.

    Quant aux fichiers à compiler, c'est résolu dans le makefile, et là les autotools doivent être nos amis IIRC. D'autres systèmes de compilation intelligents comme AAP/bjam/... s'en sortent également.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut
    Deja merci pour vos solutions, sinon je n'est tjrs pas de resultats ou bien je ne vous comprend pas bien. J'ai de nouveau essaye la proposition de Millie mais le compilateur me renvoie juste a l'erreur ie il ne reconnais ni LINUX ni SOLARIS. Je vais essayer de prensenter les fcts
    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
     
    //fichier_linux.h
    #include "umfpack.h"  // biblioteque permettant de resoudre des systemes lineaires sous linux
    // declaration de ma classe solver avec les parametres utils pour le solver umfpack
    void solver(param a)
    // les variables ici ont des types et nombres differents a celles de Solaris 
     
    //fichier_linux.C
    #include "fichier_linux"
    // fcts permettant d'ajuster les parametres du solver umfpack
    void nomclasse::solver(a) {
     ..........// 
    }
     
     
    //fichier_sun.h
    #include "sunperf.h"  // biblioteque permettant de resoudre des systemes lineaires sous solaris
    // declaration de ma classe solver avec les parametres utils pour le solver sunperf
    void solver(param a)
     
    //fichier_sun.C
    #include "fichier_sun"
    // fcts permettant d'ajuster les parametres du solver sunperf
    void nomclasse::solver(a)
    par la suite je voudrais avoir un main.C au lieu de 2 (1 pr chaque solver) , et le main appelle la fct solver soit de linux si je lance le programme sous linux, soit de Solaris si je suis sur Solaris.
    merci de me repondre

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Pour compiler, il faut utiliser l'option -DLINUX ou -DSOLARIS (mais il y a des valeurs pour chaque OS prédéfini, mais que je connais pas, par exemple sous windows, c'est Win32 si je ne m'abuse).

    Donc pour compiler, tu fais (avec g++) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    g++ -Wall -W -DLINUX monprogramme.cpp
     
    ou :
     
    g++ -Wall -W -DSOLARIS monprogramme.cpp
     
    si tu fais juste :
    g++ monprogramme.cpp
    Ni SOLARIS, ni LINUX ne sera définie, c'est pour ça que tu as l'erreur
    Donc, dans le makefile,
    dans le CFLAGS, tu peux ajouter cette option.

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Par défaut
    Super Millie ca marche !!!!!!!!!!!!!!!
    merci a tous

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu peux aussi regarder du côté de boost build.
    C'est compliqué à prendre en main, mais c'est quand même pas mal pour compiler sur sur divers plate-formes.

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

Discussions similaires

  1. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  2. [Kylix] libc.system
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 19/10/2002, 13h48
  3. [VB6] [Système] Barre des taches
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 15h16
  4. [VB6] [Système] Icones du systray qui veulent pas partir
    Par Ctof dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/10/2002, 09h41
  5. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

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