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 :

problème compilation c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 55
    Par défaut problème compilation c
    Bonjour,
    j'ai 3 fichier en C
    fich1.c
    fich2.c
    main.c

    j'utilise codeBlocks

    quand je compile au lieu de passer par le main qui appelle fich1 et fich2
    le compilateur débute par compiler fich1 et fich2

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je ne vois pas où est le problème. On peut compiler n'importe quel fichier sans se soucier des autres de fichiers du projet. La commande pour compiler un fichier dans C::B est Build > Compile Current File (Ctrl + Shift + F9).

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 36
    Par défaut
    Salut,

    Euh, quoi de plus normal si tu lui demande de compiler l'intégralité du projet ?

    Pour produire ton exécutable, le compilateur a besoin de tous les fichiers objet.

    En effet pour réaliser la dernière étape de la compilation (l'édition des liens) il faut les trois fichiers objet correspondant à tes trois fichiers source.

    En gros, la dernière directive de compilation pour obtenir ton exécutable est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o nom_exécutable main.o fichier1.o fichier2.o (+ des options, généralement -Wall et -pedantic)
    main.o, fichier1.o et fichier2.o sont des fichiers nécessaires à la création de ton exécutable, c'est ce que l'on appelle des dépendances.

    Pour obtenir des fichiers, par exemple main.o il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o main.o main.c (+options)
    Il faut donc compiler ces trois fichiers, peut importe l'ordre du moment que l'on obtienne les fichiers objet. Codeblocks a choisi de commencer par ton main

    Je te conseille de compiler par toi même ton projet en ligne de commande, tu comprendras mieux L'idéal étant d'utiliser un makefile c'est facile et rapide.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 55
    Par défaut
    le problème est:
    fich1 j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef
          struct{
    	     double R;
    	     double I;
                }complex;
    quand le fich2 se compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    complex Complex_canal(double x)
    {
          complex A;
         .....
    il ne reconnais pas "complex"
    error: syntax error before "Complex_canal"|

    error: `complex' undeclared (first use in this function)|

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par benza Voir le message
    quand je compile au lieu de passer par le main qui appelle fich1 et fich2 le compilateur débute par compiler fich1 et fich2
    Et…*qu'est-ce qui t'ennuie ?

    Le compilateur ne va pas suivre lui-même le fil de l'exécution d'un programme. Il va compiler ce qu'il trouve dans chaque fichier vers un fichier objet. L'usage veut qu'il y ait un fichier objet par fichier *.c, mais ce n'est pas une obligation technique.

    Chacun de ces fichiers objets va en fait contenir la forme compilée de ce que le compilateur a trouvé en examinant tes fichiers sources. Notamment les fonctions, pour lesquelles on retrouvera d'un côté le code compilé et, de l'autre, une table de correspondance entre les noms de fonctions et leur point d'entrée dans le code compilé. À charge à quiconque, à ce stade, d'utiliser ces ressources comme bon lui semble.

    Cette dernière tâche, en fait, va revenir à l'éditeur de liens (linker), dont le travail consiste à retrouver dans les différents fichiers objets les ressources appelées par d'autres, mais il n'y a plus de notion de hiérarchie à ce stade.

    Enfin, le compilateur peut demander à l'éditeur de liens de générer un fichier exécutable en particulier (ce qui est pratiquement toujours le cas). Pour cela, il va ajouter au fichier final tous les headers nécessaires à l'intégration dans le système d'exploitation du fichier compilé ET va rechercher une fonction nommée « main » pour s'en servir de point d'entrée dans ton programme.

    Donc, l'ordre dans lequel les différents fichiers objets sont compilés dans la première phase importe peu. À dire vrai, ils pourraient même l'avoir été par un autre compilateur. C'est spécialement vrai lorsque tu utilises des bibliothèques statiques ou des morceaux de programmes écrits dans d'autres langages.

    EDIT : (j'ai oublié de recharger la page avant de poster, désolé !)

    il ne reconnais pas "complex"
    error: syntax error before "Complex_canal"|

    error: `complex' undeclared (first use in this function)|
    Et bien, c'est justement pour cela que l'on utilise des fichiers « *.h » !

    Ces fichiers sont censés contenir les définitions de structures, les déclarations de variables externes, et les prototypes de fonctions. Bref : tout ce qui est déclaré ou défini mais pas encore instancié.

    Un tel fichier va donc expliquer comment une fonction doit être appelée sans qu'il dispose du code : du moment que le nom de la fonction, ses arguments et leurs types sont précisés, c'est tout ce qu'il faut au compilateur pour produire du code exécutable qui sera lié ensuite aux autres fichiers.

    Il faut donc que tu écrives un fichier *.h pour chaque fichier *.c, dans lequels tu n'écriras que les prototypes de tes fonctions. Il faudra faire ensuite un #include "fichier.h" au début de chaque fichier *.c qui y fait appel.

Discussions similaires

  1. [VB5] Problème compilation, ocx manquants
    Par rastali dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/10/2005, 14h39
  2. [Kylix] Problème de compilation
    Par rabbi_jaccob dans le forum EDI
    Réponses: 3
    Dernier message: 25/07/2005, 23h36
  3. Problème compilation (toolkit Maximum Entropy)
    Par yannick_frere dans le forum MFC
    Réponses: 4
    Dernier message: 07/03/2005, 09h47
  4. Problème compilation Version 8.0.1 sous Debian Sarge
    Par LIndien dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/02/2005, 21h38
  5. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21

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