Référence indéfinie + pointeur sur fonction

Résolu/Fermé
Utilisateur anonyme - Modifié le 15 mai 2017 à 17:23
 Utilisateur anonyme - 16 mai 2017 à 10:49
Bonjour,

voila 3 jours que je fait face a une erreur de compilation de type
: référence indéfinie vers [....]

impossible de comprendre mon erreur .
j'utilise un tableau de pointeur sur fonction et j'ai le droit a cette erreur sur chacune des fonctions pointé ...

chaque fonction posant problème est définie dans un fichier propre a son groupement.
ces 4 fichiers inclue bien le .h (qui lui est commun a tout les fichiers)
mon Makefile contient chaque fichier comme il faut.
et je fournie les même et bon paramètre a chaque fonction ....

je peut pas vous donner tout mon code mais voici de quoi illustrer :

void Psfonc(t_Serv *S, char *buff, int nbr)
{
  int (*Psf[18])(t_Serv *, char *);

  Psf[0] = cmd_0;
  Psf[1] = cmd_1;
  Psf[2] = cmd_2;
  Psf[3] = cmd_3;
  Psf[4] = cmd_4;
  Psf[5] = cmd_5;
  Psf[6] = cmd_6;
  Psf[7] = cmd_7;
  Psf[8] = cmd_8;
  Psf[9] = cmd_9;
  Psf[10] = cmd_10;
  Psf[11] = cmd_11;
  Psf[12] = cmd_12;
  Psf[13] = cmd_13;
  Psf[14] = cmd_14;
  Psf[15] = cmd_15;
  Psf[16] = cmd_16;
  Psf[17] = cmd_17;

  if (nbr >= 0)
    (Psf[nbr])(S, buff);
  else if (nbr == -2)
    write(S->fd_fils, Log_KO, strlen(Log_KO));
  else
    write(S->fd_fils, Unknown, strlen(Unknown));
}


et voila les prototypes contenue dans le .h

/*--- RequestFinder.c ---*/
int CmdTab(t_Serv *, char*);
void Psfonc(t_Serv *, char *, int);

/*--- Cmd/cmd_A_One.c ---*/
int cmd_0(t_Serv *, char*);
int cmd_1(t_Serv *, char*);
int cmd_2(t_Serv *, char*);
int cmd_3(t_Serv *, char*);

/*--- Cmd/cmd_A_Two.c ---*/
int cmd_4(t_Serv *, char*);
int cmd_5(t_Serv *, char*);
int cmd_6(t_Serv *, char*);
int cmd_7(t_Serv *, char*);

/*--- Cmd/cmd_B_One.c ---*/
int cmd_8(t_Serv *, char*);
int cmd_9(t_Serv *, char*);
int cmd_10(t_Serv *, char*);
int cmd_11(t_Serv *, char*);
int cmd_12(t_Serv *, char*);

/*--- Cmd/cmd_B_Two.c ---*/
int cmd_13(t_Serv *, char*);
int cmd_14(t_Serv *, char*);
int cmd_16(t_Serv *, char*);
int cmd_17(t_Serv *, char*);



des idées de pourquoi cette erreur est présente ?
merci de votre aide, une fois de plus.


1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 15 mai 2017 à 18:57
Salut astrocurieux,

"Undefined reference" est une erreur signalée au stade de la liaison.

As tu bien mis dans ton makefile ou dans ta ligne gcc les fichiers .c où sont implémentées tes fonctions ?

Le code suivant compile bien :

typedef struct { int something; } t_Serv;

int cmd_0(t_Serv *, char*);

int cmd_0(t_Serv * first_param, char* second_param) {
    /* do something extraordinary */
    return 0;
}

int main(void) {
    int (*Psf[18])(t_Serv *, char *);

    Psf[0] = cmd_0;

    return 0;
}

Ainsi, d'après les commentaires dans ton .h,
cmd_0()
serait implémentée dans
Cmd/cmd_A_One.c
qu'il te faut donc compiler, afin de disposer d'un .o accessible au linker que tu passes dans la phase de liaison.

Dal
0
Utilisateur anonyme
15 mai 2017 à 20:33
bonsoir Dal, merci de te penché sur mon problème.

j'utilise un Makefile qui d'ordinaire sur d'autre projet fonctionne a la perfection.
j'ai effectivement bien indiquer les différents chemins et nom des fichiers et ce dernier parvient a tout compilé quand il n'y a pas d'erreur.

j'ai peur d'avoir crée une inclusion circulaire entre mes fichiers pour être franc ...
je suis habitué au C et Cpp et la rien a faire je ne comprend pas de ou provient l'erreur.
0
Utilisateur anonyme
15 mai 2017 à 20:48
après t'avoir lue je suis tout de même retourné sur mon Makefile. Ce dernier compile en une seul fois deux binaire différent et évidement caché dans les dizaine de fichier j'en est retrouver un en doublons dans les deux sources.

après sa suppression tout marche de nouveau comme avant.
merci de m'avoir diriger dans la bonne direction.

sujet résolut
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
16 mai 2017 à 10:17
super :-)

les Makefile peuvent être des galères absolues, bravo d'avoir trouvé l'origine de l'erreur :-)

dernièrement, je suis tombé sur çà : https://mesonbuild.com/ qu'il faut que je creuse un de ces jours

le projet est jeune, mais il a l'air prometteur, si cela ne te fait pas peur de sortir des outils purs GNU :-)
0
Utilisateur anonyme > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
16 mai 2017 à 10:49
très intéressant comme projet,
je manque de temps pour m’investir sur d'autre projet mais je le garde sous le coude.
c'st courageux de ce lancer sur du GNU ^^


bonne journée
0