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

  1. #1
    Membre actif
    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
    Points : 279
    Points
    279
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    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 actif
    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
    Points : 279
    Points
    279
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    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 actif
    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
    Points : 279
    Points
    279
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    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.

  9. #9
    Membre actif
    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
    Points : 279
    Points
    279
    Par défaut
    mais dans api_user.c je n'ai pas de variable ! enfin j'utilise celle déclaré dans start.c donc tu veux dire que dans start.c je doit déclarer les variables comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern int LED[3] = {0,0,0};
    extern int bras_droit = 0;
    extern int bras_gauche = 0;
    extern int nbr_simultane = 0;
    extern char phrase[250];

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    L'inverse

    Il faut que tu les mettes avec extern dans api_user.c et les laisser telles quelles dans start.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern int LED[3];
    extern int bras_droit;
    extern int bras_gauche;
    extern int nbr_simultane;
    extern char phrase[250];

  11. #11
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par gastoncs Voir le message
    mais dans api_user.c je n'ai pas de variable !
    Et toutes celles que tu essayes de "return", ce sont quoi ?

    Citation Envoyé par gastoncs Voir le message
    enfin j'utilise celle déclaré dans start.c
    Oui justement, c'est très mal et moche.
    Pourquoi déclarer dans start les variables de api_user ?!? Ca défie le bon sens.

    Citation Envoyé par gastoncs Voir le message
    donc tu veux dire que dans start.c je doit déclarer les variables comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern int LED[3] = {0,0,0};
    extern int bras_droit = 0;
    extern int bras_gauche = 0;
    extern int nbr_simultane = 0;
    extern char phrase[250];
    Non, ça ça devrait être dans api_user.h
    start.c ne devrait avoir besoin que d'inclure api_user.h
    et api_user.c doit déclarer ses variables.
    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.

  12. #12
    Membre actif
    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
    Points : 279
    Points
    279
    Par défaut
    Ok merci pour votre aide, j'ai maintenant fait ceci, dans mon start.c j'ai :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include "v2_api_robby.h"
    #include "api_user.h"
     
    //////////////////////////////////////////////////
    // fonction de api_robby_version 2 //
    /////////////////////////////////////////////////
    //fonction affichant l'état de le LED n° n  
    //retourne 0=> eteinte , 1=> allumée
    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();
    }
    }
     
    //fonction qui eteint ou allume la LED n° n
    //pour eteindre e=>0 , pour allumer e=>1
    void v2_eclaire_LED(int n, int e){
    	if (n == 1 && e == 1) { allume_LED1(); }
    	else if (n == 1 && e == 0) { eteint_LED1(); }
    	else if (n == 2 && e == 1) { allume_LED2(); }
    	else if (n == 2 && e == 0) { eteint_LED2(); }
    	else if (n == 3 && e == 1) { allume_LED3(); }
    	else if (n == 3 && e == 0) { eteint_LED3(); }
    }
     
    //fonction qui affiche l'état du bras en degrées
    //si b=> 0 bras droit, si b=> 1 bras gauche
    int v2_etat_bras(int b){
    	if (b==0) {
    		return etat_bras_droit();
    	}
    	else if (b==1) {
    		return etat_bras_gauche();
    	}
    }
     
    //fonction qui positionne le bras du robot avec a => angle en °
    // si b=> 0 bras droit, si b=> 1 bras gauche
    void v2_rotate(int b, int a){
    	if (b==0){
    		rotate_bras_droit(a);
    	}
    	else if (b==1) {
    		rotate_bras_gauche(a);
    	}
    }
     
    //synthetiseur vocale pour la phrase passé en parametre
    //void v2_dicte(char *s){
    //	voix[] = s;
    //	printf("%s", voix);	
    //}
     
    //crée un processus pour un nouveau programme
    int v2_nouveau_programme(void (*nouv_prog)()){
     
    pid_t processus;
    processus = fork();
     
    if (processus == -1) { // erreur
    	printf("erreur dans la creation du processus"); 
    	return 0;
    }
     
    else if (processus == 0) { //processus fils
    	nbr_simultane++;
    	printf("processus fils de pid %d et de pére%d\n",getpid(), getppid()); 
    	nouv_prog();
    	return 4;
     
    }}
     
    void mon_programme_1()
    {
    	v2_rotate(0,90);
    }
     
    void mon_programme_2()
    {
    	printf("etat du bras : %d\n", v2_etat_bras(0));
    }
     
    int main(){
    printf("etat du bras droit %d\n",v2_etat_bras(0));
    v2_nouveau_programme(mon_programme_1);
    //sleep(5);
    v2_nouveau_programme(mon_programme_2);
     
    return 0;
     
    }
    et dans api_user.h j'ai donc mis les proto et mes variables :
    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
    #ifndef API_USER
    #define API_USER
     
    // les variables de l'état du robot
    int LED[3] = {0,0,0};
    int bras_droit = 0;
    int bras_gauche = 0;
    int nbr_simultane = 0;
    char phrase[250];
     
    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);
     
    #endif
    et enfin mes fonctions 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #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;
    }
     
    int etat_bras_gauche(){
    	return bras_gauche;
    }
    int etat_bras_droit(){
    	return bras_droit;
    }
     
    void rotate_bras_gauche(int a){
    	bras_gauche = a;	
    }
    void rotate_bras_droit(int a){
    	bras_droit = a;
    }
     
    //void dicte(char *s){
    //	return 1;
    //}
    mais quand je compile start. et api_user.c j'obtient :
    multiple definition of LED
    multiple definition of bras_droit
    multiple definition of bras_gauche
    multiple definition of nbr_simultane

  13. #13
    Membre actif
    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
    Points : 279
    Points
    279
    Par défaut
    c'est bon j'avais mal lu "bousk" j'ai donc déclarer tout dans api_user.c et sa fonctionne.
    merci encore pour votre aide

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