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 :

#include de fichier.h ne fonctionne pas


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut #include de fichier.h ne fonctionne pas
    Bonjour je fait sous linux de la programmation systéme et j'ai definit dans mon fichier api_user.h les prototypes de mes fonctions, ensuite dans api_user.c j'ai mis mes fonctions.

    dans mon programme principale nommé start.c j'ai au début du programme un include vers mon .h comme ceci :
    mais quand je l'execute sur ma console linux en tapant :
    gcc start.c -o start

    la j'obtient plusieurs messages d'erreur me disant "undefined reference to" ... mes fonctions déclaré dans api_user.c aurais je oublié quelques chose ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Il faut aussi compiler api_user pour que le compilateur puisse ensuite faire les liens.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut
    de cette façon :
    gcc start.c api_user.c -o start

    lorsque je le fais j'obtient toujours la meme chose, est ce que dans api_user.c je doit mettre un include vers api_user.h ?

    j'obtient aussi pour toutes les fonctions de api_user.c le nom de la fonction suvi de : undeclared (first use in this function)

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Il faudrait que tu nous montres ton code pour avoir une réponse plus précise. Mais oui il faut dans le fichier api_user.c un #include "api_user.h".

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut
    oui d'accord c'est ce que j'ai fait, mais voici un bout de code des 3 fichier :

    start.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
    25
    26
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include "api_user.h"
     
    int LED[3] = {0,0,0};
    int bras_droit = 0;
    int bras_gauche = 0;
    int nbr_simultane = 0;
    char phrase[250];
     
    int v2_etat_LED(int n);
     
    int v2_etat_LED(int n){
    	if (n == 1) { 
    		return etat_LED1(); 
    	}
    	else if (n == 2) {
    		 return etat_LED2();
    }
    	else if (n == 3) { 
    		return etat_LED3();
    }
    api_user.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
    int etat_LED1();
    int etat_LED2();
    int etat_LED3();
    void allume_LED1();
    void allume_LED2();
    void allume_LED3();
    void eteint_LED1();
    void eteint_LED2();
    void eteint_LED3();
    int etat_bras_gauche();
    int etat_bras_droit();
    void rotate_bras_gauche(int a);
    void rotate_bras_droit(int a);
    void dicte(char *s);
    et dans api_user.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
    25
    26
    27
    28
    29
    30
    31
    #include "api_user.h"
     
    int etat_LED1(){
    	return LED[0];
    }
    int etat_LED2(){
    	return LED[1];
    }
    int etat_LED3(){
    	return LED[2];
    }
     
    void allume_LED1(){
    	LED[0] = 1;
    }
    void allume_LED2(){
    	LED[1] = 1;
    }
    void allume_LED3(){
    	LED[2] = 1;
    }
     
    void eteint_LED1(){
    	LED[0] = 0;
    }
    void eteint_LED2(){
    	LED[1] = 0;
    }
    void eteint_LED3(){
    	LED[2] = 0;
    }
    voila et le genre de message que j'obtient c'est :
    in function etat_LED2 : erreur LED undeclared (first use in this function)
    et ce pour toutes mes fonctions de api_user.c

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    C'est un autre problème. Ce que le compilateur ne trouve pas ce n'est les fonctions mais les variables que tu as déclaré dans api_user.c.

    Il va falloir aussi les déclarer dans api_user.h avec le mot réservé "extern" pour préciser que ces variables pourront être utilisées en dehors du fichier api_user.c

    Une autre remarque : il faut que encadre dans le fichier d'entête api_user.h toutes les déclarations avec les macros suivantes pour éviter qu'elles soient déclarées plusieurs fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef API_USER
    #define API_USER
     
     
    #endif
    Le code doit se trouver entre le #define et le #endif.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si tu nous donnais les messages d'erreur en entier, ce serait aussi bien plus simple. :o

    En compilant chez moi, j'obtiens tout plein de :
    error: 'LED' undeclared (first use in this function)|
    Il faut déclarer la variable LED (je présume de manière statique).

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    undefined reference n'est pas un problème d'include (et cette directive preprocesseur fonctionne très bien - ouf), mais un problème de link.
    si start a besoin de api_user, l'inclure lui permet de compiler en lui indiquant que les éléments existent.
    Mais pour fonctionner, après la compilation il y a le linkage, et il doit aller chercher dans api_user(.so, .lib, .a, ...) les éléments qu'il lui faut.

    Donc forcément, si tu ne link pas api_user, les référence manqueront.
    La compilation devrait plus ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc start.c -o start -lapi_user
    ou peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc start.c -o start (-o ?) api_user
    Par ailleurs, tes fonctions dans api_user.c, déclarés dans api_user.h utilisent des variables déclarés dans start.c !!! Ce qui semble l'essence du problème en fait.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Deploiement d'un fichier WAR ne fonctionne pas
    Par Nexussmb dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 16/03/2008, 20h22
  2. Réponses: 5
    Dernier message: 14/02/2008, 21h20
  3. Mes appels vers es fichiers .js ne fonctionnent pas.
    Par jmgodson dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/01/2008, 09h51
  4. La modification des fichiers jsp ne fonctionne pas
    Par red210 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 10/09/2007, 14h11
  5. Fichiers SWF ne fonctionnent pas
    Par Alma dans le forum Flash
    Réponses: 14
    Dernier message: 29/06/2006, 16h50

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