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 :

embrouille entre header stl et MonProj


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut embrouille entre header stl et MonProj
    Bonjour à tous,

    Je travaille sur une librairie en c++ multi environnements (windows, macos, linux).

    pour ce qui est de linux, elle doit fonctionner sous:
    - Linux 2.6.x / g++ 4.3.2 / libc 2.8.9
    - Linux 2.4.x / g++ 3.2.3 / libc 2.3.2
    - Linux Debian Woody / g++ 2.95 / libc 2.2

    La libairie compile et fonctionne parfaitement sur les 2 premiers linux (et également windows et mac).

    Sur le troisième linux -le plus ancien-, j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    In file included from /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_alloc.h:42,
                     from /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/alloc.h:21,
                     from /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/std/bastring.h:39,
                     from /usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/string:6,
                     from ../../../api/LineNumberReader.h:24,
                     from ../../common/client/AppClient.cpp:38:
    /usr/lib/gcc-lib/i386-linux/2.95.4/include/new:9: directory `../../common/exception' specified in #include
    Ce qui semble poser problème, c'est la définition dans le makefile d'un répertoire d'include du projet s'appelant "../../common/exception" (-I)
    Dans la STL, l'interface new fait un #include <exception> que le compilateur cherche d'abord dans le répertoire du projet.

    La solution de renommer le répertoire 'exception' du projet en 'exceptions' corrige le problème. Mais ca m'ennuie de faire cette modification
    Pour confirmer le problème, dans le source new de la stl, j'ai modifié 'include <exception>' par 'include "exception"'. et ca permet de compiler. puisqu'il va d'abord chercher 'exception' dans le répertoire courant.

    Les questions:
    -Existe-t-il une spécificité de g++ 2.95 par rapport aux versions plus récentes expliquant ce résultat?
    -Et surtout, existe il une astuce (option de compil ou autre)?

    En vous remerciant. A bientot.

  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
    Ce serait possible de voir l'inclusion dans le fichier en question (AppClient.cpp) et la ligne de compilation ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    d'abord merci de consacrer du temps au problème.

    les include de AppClient cpp

    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
     
    #ifdef WIN32
    #ifdef USE_MFC
    #include "afxwin.h"
    #else
    #include "windows.h"
    #endif
    #endif
     
    #include "Synchronisation.h"
     
    #include "InitTrace.h"
    #include "AppClient.h"
    #include "Message.h"
    #include "gclver.h"
     
    #include "LineNumberReader.h"
    #include "File.h"
    #include "FileWriter.h"
    #include "Character.h"
     
    #include "ToutesLesException.h"

    un extrait du makefile qui est un peu long

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    REP_API_JAVA_LIKE=../../../api_java_like
    REP_COMMON=../../../common
     
    REP_CLIENT_COMMON=../../common
    REP_CLIENT_UTIL=$(REP_CLIENT_COMMON)/util
    REP_CLIENT_CLIENT=$(REP_CLIENT_COMMON)/client
    REP_CLIENT_EXCEPTION=$(REP_CLIENT_COMMON)/exception
    REP_CLIENT_TEST_UNITAIRES=$(REP_CLIENT_COMMON)/TestsUnitaires
     
    REP_SRC_LINUX=../src
     
    INCLUDES=-I$(REP_CLIENT_EXCEPTION)\
     -I$(REP_API_JAVA_LIKE)\
     -I$(REP_COMMON)\
     -I$(REP_COMMON)/linux/src\
     -I$(REP_CLIENT_COMMON)\
     -I$(REP_CLIENT_UTIL)\
     -I$(REP_CLIENT_CLIENT)\
     -I$(REP_CLIENT_TEST_UNITAIRES)\
     -I$(REP_SRC_LINUX) 
     
     
    CFLAGS=
     
    ifeq "$(CFG)"  "client_release"
    	CFLAGS+= -Wall -Di586 -DUNIX_LUX
    	LDFLAGS= -Wl -shared -ldl
     
    	REPVER=release
    else
    	ifeq "$(CFG)"  "client_debug"
    		CFLAGS+= -Wall -Di586 -g -pedantic -DUNIX_LUX -D_XOPEN_SOURCE=600 -D_DEBUG
    		LDFLAGS=-Wl -shared -ldl
     
    		REPVER=debug
    	endif
    endif
     
    ...
    ...
    LISTES DES SOURCES POUR CHAQUE REPERTOIRE
    ...
    ...
     
     
    SRCS=$(SOURCE_FILES) $(COMMON) $(API_JAVA_LIKE) $(CLIENT_COMMON) $(CLIENT_UTIL) $(CLIENT_EXCEPTION) $(CLIENT_TEST_UNITAIRES)
     
    OBJS=$(patsubst %.rc,%.res,$(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(filter %.c %.cpp %.rc,$(SRCS) ) ) ) )
     
     
     
    LIBS=-lstdc++ -lpthread
     
    CXX=g++
    CPPFLAGS=$(CFLAGS)
     
    %.o: %.cpp
    	$(CXX) $(INCLUDES) $(CPPFLAGS) -o $(notdir $@) -c $<

    dans le makefile, j'ajoute un repertoire de recherche de header REP_CLIENT_EXCEPTION qui pointe sur un répertoire "exception".

    dans AppClient je fais un include sur LineNumberReader qui lui même fait des include sur des classes de la stl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    ces includes nous emmènent jusqu'à l'interface new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef __NEW__
    #define __NEW__
     
    #pragma interface "new"
    #include <stddef.h>
    #include <exception>
    avant de la chercher la definition de "exception" dans son propre répertoire, il va regarder dans les repertoire d'include défini dans ma compilation(à cause des < .. >),.

    il trouve un homonyme avec REP_CLIENT_EXCEPTION. ce qui provoque l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/lib/gcc-lib/i386-linux/2.95.4/include/new:9: directory `../../common/exception' specified in #include
    je précise que ce problème ne se produit pas sur 2 autres env linux plus récents.

    merci

  4. #4
    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
    A priori, c'est un bug de gcc 2.95 qui ne peut pas inclure un fichier situé dans un répertoire de même nom.
    Mais n'ayant pas de gcc 2.95 sous la main, je ne peux pas vérifier.

    Tu pourrais essayer ceci pour confirmer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ mkdir Foo
    $ touch Foo/Foo
    $ echo '#include "Foo"' > Bar.cpp
    $ g++ -I Foo -c Bar.cpp
    Je suppose que ceci doit marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ echo '#include "Foo/Foo"' > Bar.cpp
    $ g++ -c Bar.cpp
    ou ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ echo '#include <Foo/Foo>' > Bar.cpp
    $ g++ -I . -c Bar.cpp

  5. #5
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    bingo.
    effectivement le premier test ne compile pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    j@woody:~$ g++ -I./Foo -c Bar.cpp
    Bar.cpp:1: directory `Foo' specified in #include
    et les 2 derniers compilent.


    pendant ce temps, j'ai installé une machine virtuelle en redhat7 (gcc 2.96)
    et je suis parvenu à compiler (après quelques péripéties)
    seulement sur cette redhat je suis en glibc2.1 et le test doit être fait avec une glibc 2.2. ah, c'est pas simple.

    aoyou, devant cet état de fait.
    quelle est la conclusion? bug gcc2.95??

    et selon vous qu'est ce qui est le mieux à faire?

    merci

  6. #6
    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
    effectivement le premier test ne compile pas
    et compile avec des versions supérieures.

    Oui, c'est un bug de gcc 2.95.

    S'il faut vraiment compiler avec un gcc 2.95, changer la façon d'inclure les fichiers (hum... ça fait du boulot tout cela) ou changer le nom du répertoire exceptions ou du fichier exceptions.

    Au fait, je n'ai pas demandé mais est-ce que ceci passe ? On ne sait jamais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ mkdir Foo
    $ touch Foo/Foo
    $ echo '#include <Foo>' > Bar.cpp
    $ g++ -I Foo -c Bar.cpp
    Autrement, vu que ça marche avec gcc 2.96, recompiler un gcc 2.96 pour la woody.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Resolu] bug gcc2.95 embrouille entre header stl et MonProj
    le dernier exemple compile.

    je suis passé à gcc 2.96 et tout se passe mieux.

    encore merci.

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

Discussions similaires

  1. Espace non souhaité entre header et menu
    Par n3ptune dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 02/10/2014, 19h37
  2. Espace entre header et le haut de la page
    Par poour dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 29/09/2014, 09h32
  3. Difference entre Header:=xlGuess Header:=xlYes
    Par Denis_67 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/12/2009, 08h23
  4. Réponses: 5
    Dernier message: 29/10/2008, 16h35
  5. Différence entre Master STL et GL
    Par Sieldev dans le forum Etudes
    Réponses: 4
    Dernier message: 11/08/2007, 17h45

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