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 :

Fonction undefined reference


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Fonction undefined reference
    Bonjour, je suis en train de développer une application avec des .c et des .h.

    Voici mes codes:

    Main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "driver_rs232.h"
     
    int main(int argc, char *argv[])
    {
        init_COM();
     
        return 1;
    }
    driver_rs232.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
     
    #ifndef RS232_H
    #define RS232_H
     
     
    #include <termios.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/signal.h>
    #include <sys/types.h>
     
    #define BAUDRATE B460800
    #define MODEMDEVICE "/dev/ttyUSB0"
     
    void signal_handler_IO (int status);
    void init_COM();
     
    #endif // RS232_H

    driver_rs232.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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include "driver_rs232.h"
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
     
    int fd, res;
    struct termios newtio;
    struct sigaction saio;           /* definition of signal action */
    char buf[4096];
     
    int wait_flag;
     
     
    void init_COM()
    {
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY |O_NDELAY);
        if (fd <0) {perror(MODEMDEVICE); }//exit(-1); }
     
     
        /* install the signal handler before making the device asynchronous */
        __sigset_t t;
        saio.sa_handler = signal_handler_IO;
        saio.sa_mask = t;
        saio.sa_flags = 0;
        saio.sa_restorer = NULL;
        sigaction(SIGIO,&saio,NULL);
     
        /* allow the process to receive SIGIO */
        fcntl(fd, F_SETOWN, getpid());
        /* Make the file descriptor asynchronous (the manual page says only
                   O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
        fcntl(fd, F_SETFL, FASYNC);
     
        //bzero(&newtio, sizeof(newtio));
        newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;
     
     
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
        newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
        newtio.c_cc[VMIN]     = 0;   /* blocking read until 5 chars received */
     
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
     
    }
     
     
    /***************************************************************************
    * signal handler. sets wait_flag to FALSE, to indicate above loop that     *
    * characters have been received.                                           *
    ***************************************************************************/
     
    void signal_handler_IO (int status)
    {
    //    cout << "received SIGIO signal." << endl;
    //    printf("received SIGIO signal.\n");
        wait_flag = 0;
    }
    Lors de la compilation,j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -Wl,-O1 -o sans_titre main.o driver_rs232.o    -L/usr/lib -lQtCore -lpthread 
    /usr/bin/ld: main.o: in function main:main.cpp(.text+0x7): error: undefined reference to 'init_COM()'
    collect2: ld returned 1 exit status
    Je précise que je suis sous Linux, je compile avec QtCreator.

    Quelqu'un aurait une idée de la source du problème ?

    D'avance merci.

  2. #2
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 855
    Points : 2 177
    Points
    2 177
    Par défaut
    Ton code m'a l'air tout à fait correct pourtant. Fais un clean puis un qmake et enfin un rebuild dans ton projet pour voir.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut
    Je viens de refaire l'opération pour la nieme fois mais ca ne marche tjrs pas.

    Je ne comprends pas du tout pourquoi ca fait ca...

    En plus c'est idiot comme problème.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    pas de namespace contagieux? pas de macros?
    renomme la fonction en init_com()…

    Sinon, ton code semble valide

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Tu as peut-être compilé ton "main" avec un compilateur C++ et ton "driver_rs232" avec un compilateur C !!!
    Vérifie les extensions de tes fichiers.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 783
    Points
    23 783
    Par défaut
    Truc bête : tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wl,-O1 -o sans_titre main.o driver_rs232.o    -L/usr/lib -lQtCore -lpthread
    … au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wl,-O1 -o sans_titre main.c driver_rs232.c    -L/usr/lib -lQtCore -lpthread
    … donc, j'imagine que tu fais de la compilation séparée et que tu as peut-être des règles explicites. Es-tu sûr, dans ce cas, que tes modules sont bien recompilés ? As-tu placé les dépendances comme il faut ? Peut-on voir ton Makefile si tu en utilise un ?

  7. #7
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Et surtout : pourquoi utiliser g++ quand il n'y a que du C ?
    Un gcc suffit.

    Et en effet, ça sent le Makefile pas bon...
    L'ordre des fichier est important...
    Il faut mettre main en dernier et les dépendances d'abord !

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wl,-O1 -osans_titre driver_rs232.c main.c -L/usr/lib -lQtCore -lpthread
    ou si tu as déjà les .o :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wl,-O1 -osans_titre driver_rs232.o main.o -L/usr/lib -lQtCore -lpthread

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Il faut mettre main en dernier et les dépendances d'abord !
    Mais... Tu mets pourtant les libs en dernier... :confus:

  9. #9
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    -L oui, mais c'est l'ordre des .o qui est important...

    Je vais chercher un Makefile a moi pour revoir l'ordre exact que j'utilise... un EDIT va venir

    EDIT :
    En effet, merci de remonter le -L !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FILE=driver_rs232.c main.c
    CFLAGS=-Wl -O1
    LDFLAGS=-L/usr/lib -lQtCore -lpthread
    SRC=$(FILE)
    OBJS=${SRC:.c=.o}
    TARGET=a.out
     
    all: ${OBJS}
    	$(CC) $(LDFLAGS) $(OBJS) -o $(TARGET)
     
    %.o: %.c
    	$(CC) $(CFLAGS) -c $<
    EDIT2 : j'avais oublié les CFLAGS et LDFLAGS (présents dans mon configure/Makefile.rules)
    Les LDFLAGS me paraissent inutiles vu que je ne vois rien en Qt... et les pthreads... pas sûr non plus...
    A tout hasard : ça n'est pas pour communiquer avec un device au bout d'un port USB avec COM émulé par USB ?

  10. #10
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Metalman Voir le message
    -L oui, mais c'est l'ordre des .o qui est important...
    Si on commence à se soucier de l'ordre des .o, c'est qu'il y a un problème de conception à la base.

  11. #11
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    On m'a soufflé la même chose à l'oreille....
    Bizarre... je me souvenais d'un problème d'ordre de fichiers dans certains de mes problèmes...

    Du coup je plussoie crocodilex sur la compilation avec gcc et g++...

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    L'ordre des .o devraient être sans importance, à la différence de certaines lib, en fonctions de leurs dépendences internes.

Discussions similaires

  1. undefined reference to 'fonction()' avec code block
    Par Marmoccelle dans le forum Code::Blocks
    Réponses: 8
    Dernier message: 01/02/2019, 16h15
  2. Fonction undefined reference avec SDL 2 et Code::Blocks
    Par therev123 dans le forum OpenGL
    Réponses: 7
    Dernier message: 07/08/2013, 18h54
  3. Undefined reference avec les fonctions d'une class
    Par romnair dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2012, 16h40
  4. Fonctions membres static - undefined reference
    Par OliveK dans le forum C++/CLI
    Réponses: 3
    Dernier message: 09/10/2010, 00h40
  5. Fonctions membres static - undefined reference
    Par OliveK dans le forum C++
    Réponses: 1
    Dernier message: 18/08/2010, 23h26

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