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 :

reference indefini lors de la compilation


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 24
    Points : 15
    Points
    15
    Par défaut reference indefini lors de la compilation
    bonjour
    lorsque que je compile mon programme il m'affiche ces erreurs et je n'arrive pas a trouver la solution
    gcc -pedantic -Wall -Wextra -Werror -std=c11 -o "main" "main.c" (dans le dossier : /home/chris/Bureau/algo)
    /tmp/ccR1Ljql.o: dans la fonction « main »:
    main.c.text+0x68): référence indéfinie vers « read_write »
    main.c.text+0x74): référence indéfinie vers « chain »
    main.c.text+0x93): référence indéfinie vers « affich_list »
    collect2: error: ld returned 1 exit status
    Compilation échouée.
    merci d'avance pour votre aide

    voici le code de mon main
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>
    #include "test.h"
     
     
     
    int main(){
    	FILE* fic = NULL;
    	Pelt t = malloc(sizeof(elt));
    	printf("8888 afic good");
    	fic = fopen("test.txt","r");
    	assert(fic!=NULL);
    	read_write(fic);
    	t=chain(fic);	
    	printf("afic good");
    	affich_list(t);
    	fclose(fic);
    	return EXIT_SUCCESS;
    }
    code de test.h
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>
    #ifndef TEST_H
    #define TEST_H
     
     
    typedef struct elt *Pelt;
    typedef struct elt {
    	char* nam;
    	Pelt next;
    }elt;
     
    typedef struct liste{
    	Pelt first;
    	int size;
    }*liste;
     
    // fonction defini dans test.c
    elt new_elt (char *n);
    Pelt new_Pelt(elt e);
    Pelt new_list();
    Pelt add_vid(Pelt lister, elt te);
    Pelt last_elt(Pelt l);
    Pelt add_list_elt(Pelt list, elt e);
    Pelt add(Pelt list, elt e);
    Pelt add_Pelt(Pelt list, Pelt b);
    void affich_list(Pelt r);
    Pelt prev_elt(Pelt l, elt e);
    Pelt suiv_elt(Pelt l, elt e);
    Pelt ins_elt(Pelt l, elt e,elt h);
     
    //fin des fonctions defini dans test.c
     
    //fonction defini dans test_read_fich.c
    FILE* read_write(FILE* f);
     
    //fin fonction defini dans test_read_fich.c
     
    //fonction defini dans full_chain.c
    Pelt chain(FILE *p);
    //fin fonction defini dans full_chain.c
    #endif
    code d'un des fichiers en .c

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>
    #include "test.h"
    #include "test_read_fich.c"
    #include "test.c"
    #define TAILLE_MAX 28
     
    Pelt chain(FILE *p){
    	Pelt li = malloc(sizeof(elt));
    	char *c =malloc(sizeof(char));
    	fgets(c,TAILLE_MAX,p);
    	elt f=new_elt(c);
    	li=new_list();
    	li=add(li,f);
    	while((*c)!=EOF){
    		f=new_elt(c);	
    		li=add(li,f);	
    		fgets(c,TAILLE_MAX,p);
    	}
     
    	return li;
    }

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    référence indéfinie (undefined reference) signifie que l'éditeur de lien ne trouve pas la définition d'un symbole externe.
    Ce sont des fonctions dont il ne trouve pas la définition, parce qu'elle ne fait pas partie des fichiers assemblés.

    Sans réglages particulier, gcc compile tous les fichiers indiqués en un exécutable.

    en l'occurence, la commande
    gcc -pedantic -Wall -Wextra -Werror -std=c11 -o "main" "main.c"
    c'est à dire
    gcc -o "main" "main.c"
    compile le binaire main a partir de main.c

    Il manque tous les autres .c.

    essaie de compiler en deux temps:
    gcc -c *.c
    gcc *.c -o main
    c'est à dire
    gcc -pedantic -Wall -Wextra -Werror -std=c11 -c *.c
    gcc -pedantic -Wall -Wextra -Werror -std=c11 *.c -o main
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chrislains Voir le message
    bonjour

    voici le code de mon main
    code d'un des fichiers en .c
    Bonjour

    Une compilation se passe en 3 étapes
    1. préprocesseur
    2. analyse et création du module objet
    3. assemblage de tous les objets, en y rajoutant aussi les librairies diverses (dont la standard) pour créer l'exécutable (étape nommée "édition des liens")


    Généralement, quand le programme entier tient dans un seul source, les 3 étapes sont alors automatiquement déroulées en une seule opération et rien ne vient distinguer une étape ou une autre. Mais si le programme est séparé en plusieurs sources, alors il faut compiler chaque source en s'arrêtant à l'étape 2 (commande cc -c) puis en final, demander la dernière étape en y incluant manuellement tous les objets. Sinon l'éditeur de liens ne sait pas où trouver le code des fonctions définies dans les autres sources.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cc -c main.c
    cc -c test.c
    cc -c read_fich.c
    cc -c full_chain.c
    cc main.o test.o read_fich.o full_chain.o -o nom_executable
    (éventuellement avec gcc au lieu de cc et en y rajoutant si on le désire des options spécifiques de contrôle ou d'optimisation)

    Ensuite, quand le nombre de sources devient trop important et que ça gonfle de devoir tout retaper à chaque fois (surtout que parfois c'est long de tout recompiler alors qu'un seul source est modifié), un outil nommé "make" permet, à partir d'un fichier "Makefile" configuré pour décrire qui dépend de quoi, permet alors d'automatiser la compilation intelligente (quand une branche est modifiée, seule celle-ci est alors recompilée)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/12/2009, 23h00
  2. Réponses: 6
    Dernier message: 01/06/2007, 18h21
  3. [Debutant] probleme lors de la compilation
    Par boobi dans le forum Débuter
    Réponses: 5
    Dernier message: 26/08/2005, 15h57
  4. [MYSQL] Probleme lors de la compilation
    Par Nasky dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 24/02/2004, 17h04
  5. Warnings lors de la compilation
    Par polo54 dans le forum C
    Réponses: 5
    Dernier message: 07/02/2003, 09h12

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