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

Linux Discussion :

Makefile -O2 problèmes, pourquoi ?


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Makefile -O2 problèmes, pourquoi ?
    Bonjour à tous,

    Voici mon makefile :

    ifdef RELEASE
    CMODE=-O2 -DNDEBUG
    else
    CMODE=-O0 -g3
    endif

    CC=g++
    CFLAGS=-c -Wall $(CMODE) -I$(ozSVN)
    LDFLAGS=-lexpat -lsqlite3
    SOURCES=$(ozSVN)/ozxml.cpp $(ozSVN)/ozudpconnect.cpp $(ozSVN)/ozsqlite.cpp $(ozSVN)/ozsocket.cpp bdd.cpp client.cpp config.cpp main.cpp
    OBJECTS=$(SOURCES:.cpp=.o)
    EXECUTABLE=ecs_server

    all: $(SOURCES) $(EXECUTABLE)
    ifeq ($(EXECUTABLE),)
    @echo "\$$EXECUTABLE is not define in the Makefile !"
    else
    ifdef RELEASE
    @echo "******** Release mode ********"
    else
    @echo "******** Debug mode ********"
    endif
    endif

    $(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

    .cpp.o:
    $(CC) $(CFLAGS) $< -o $@

    clean:
    rm -rf *o $(EXECUTABLE)
    rm -rf $(ozSVN)/*o
    Mon problème est ICI : CMODE=-O2 -DNDEBUG
    Lorsque je mets l'option -O2 mon programme compile et lorsque j'utilise un mutex ce dernier reste en attente ... alors qu'il n'y a aucune raison.
    Si je mets -O1 ou -O0 le programme marche parfaitement bien.

    Ma question est : Y à t'il une spécificité avec cette option ou autre ?

    Voici les 2 fonctions de mon mutex :

    #include <pthread.h>
    #define ozMutexType pthread_mutex_t *

    static ozMutexType ozMutexOpen()
    {
    pthread_mutex_t theMutex = PTHREAD_MUTEX_INITIALIZER;
    if ( pthread_mutex_init(&theMutex, NULL) != 0)
    {
    ozAssertFail("Error create mutex !");
    return NULL;
    }
    return &theMutex;

    }

    static bool ozMutexLock(ozMutexType aMutex)
    {
    if (aMutex == NULL) //aMutex musn't be null
    {
    ozAssertFail("aMutex is NULL");
    return false;
    }

    if(pthread_mutex_lock(aMutex) != 0) //Mon programme attend ICI
    {
    ozAssertFail("Error pthread_mutex_lock !");
    return false;
    }

    return true;
    }
    $gcc --version >> gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

    Merci d'avance de vos réponses.

  2. #2
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Dans la première fonction, tu retournes un pointeur sur un objet local à la fonction. Cherche plutôt l'erreur de ce côté.

    Didier

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par o0zzz Voir le message
    Ma question est : Y à t'il une spécificité avec cette option ou autre ?
    oui

    Comme son nom l'indique, -O2 ou -O3 sont des options d'optimisation.

    A partir de -O2, les optimisations commencent à devenir drastiques.

    Du coup, un certain nombre de fonctions - fonctionalités - algos risquent de ne plus marcher....

    Donc, pour un programme "standard", aucun problème.

    Pour tout programme un peu complexe, c'est à voir après essai, si justement ça marche toujours comme avant ou non.

    Dans ton cas visiblement non. Donc voilà... Pas de -O2 pour ton programme..

    Est-ce relié aux mutex ? je ne sais pas , je n'ai jamais utilisé. D'autres ici sauront mieux que moi te répondre là-dessus, mais je t'ai donné la réponse à ta question

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Hum ok,

    Je pense que vos 2 réponses combiné me font ma réponse, le fait de retourner un objet local marche, car je retourne l'adresse de cet objet, du cou l'objet en lui même est détruit mais pas la référence vers lequel il pointe (si je ne me trompe pas), du cou en O0 et O1 tout ceci doit parfaitement marcher cependant en O2 il doit me détruire ma référence vers lequel il pointe je pense effectivement que mon problème peut venir de là.

    Je teste ceci et je vous tiens au courant !
    Encore merci pour vos réponses .

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par o0zzz Voir le message
    le fait de retourner un objet local marche, car je retourne l'adresse de cet objet, du cou l'objet en lui même est détruit mais pas la référence vers lequel il pointe (si je ne me trompe pas)
    Ceci ne peut marcher que si l'objet est alloué dynamiquement....

    Si c'est un objet local dont on retourne l'adresse, il n'existe plus, donc ce qui est pointé par son adresse est écrasée par la prochaine instruction ou le prochain appel à une fonction...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Ceci ne peut marcher que si l'objet est alloué dynamiquement....

    Si c'est un objet local dont on retourne l'adresse, il n'existe plus, donc ce qui est pointé par son adresse est écrasée par la prochaine instruction ou le prochain appel à une fonction...
    Oui je viens de faire le test vous avez raison j'ai mis mon mutex en global juste pour le test et tout marche parfaitement bien, erreur de débutant :/, je pensais qu'il me garderait la référence.

    Merci encore.

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Evidemment qu'il te garde la "référence", mais le problème c'est que la "référence" en question pointe vers du n'importe quoi.

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/04/2007, 11h01
  2. problème avec perl Makefile.PL
    Par flores dans le forum Modules
    Réponses: 2
    Dernier message: 30/10/2005, 20h09
  3. [MAKE] problème export sur makefile recursif
    Par tomasha dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 07/10/2005, 20h08
  4. [Dev-cpp]Problème de Makefile
    Par gege2061 dans le forum Dev-C++
    Réponses: 2
    Dernier message: 15/02/2005, 12h19
  5. Problème avec makefile
    Par snooopppp dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 22/02/2004, 16h46

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