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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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 éclairé
    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
    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

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

    Sinon, ton code semble valide

  5. #5
    Membre émérite 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
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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:
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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