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

Code::Blocks Discussion :

undefined reference to 'fonction()' avec code block


Sujet :

Code::Blocks

Vue hybride

Marmoccelle undefined reference to... 23/04/2013, 13h58
germinolegrand Bonjour ! As-tu ajouté le... 24/04/2013, 20h59
Marmoccelle Oui bien sur, ils... 25/04/2013, 10h12
germinolegrand mmh... En faisant clic droit... 25/04/2013, 11h54
Marmoccelle Oui tout est bien coché. ... 25/04/2013, 12h30
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut undefined reference to 'fonction()' avec code block
    Salut à tous,

    Pour un projet perso d'électronique, je développe une IHM PC avec l'aide de la librairie GTK+. J'ai déjà tenté l'expérience dans le passé avec succès.

    Aujourd'hui, la compilation échoue sitôt que mes fonctions sont éclatées dans différents fichiers header/source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Build Message:
     
    obj\Debug\main.o: In function `main':
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:42: undefined reference to `onDestroyWindow(_GtkWidget*, void*)'
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:43: undefined reference to `onDeleteEventWindow(_GtkWidget*, void*)'
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:48: undefined reference to `onClickedQuit(_GtkWidget*, void*)'
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:51: undefined reference to `onClickedConnect(_GtkWidget*, void*)'
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:54: undefined reference to `onClickedLoad(_GtkWidget*, void*)'
    Y:/Documents/Dev/CodeBlocks/Test/TestHeader/main.cpp:57: undefined reference to `onClickedSave(_GtkWidget*, void*)'
    collect2.exe: error: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    6 errors, 0 warnings (0 minutes, 1 seconds)
    Par contre, si je regroupe tout dans mon main.c aucun problème, je peux executer et debugger le programme sans problème...

    Je ne vois pas ce qu'il me manque, surement un oubli au niveau de la config de l'IDE, mais je sèche complètement. Voici mon code:

    main.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
    62
    63
    64
    65
    66
    67
    68
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    #include "Test.h"
     
     
    int main(int argc,char **argv)
    {
        /*
         ***************************
         * Declaration des WidGets *
         ***************************
         */
        GtkWidget *pMainWindow = NULL;
     
        GtkWidget *pQuitBtn = NULL;
        GtkWidget *pConnectBtn = NULL;
        GtkWidget *pLoadBtn = NULL;
        GtkWidget *pSaveBtn = NULL;
     
        GtkWidget *pTable = NULL;
     
     
        // GTK+ Initialisation
        gtk_init(&argc,&argv);
     
        // Build main window
        pMainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(pMainWindow), GTK_WIN_POS_CENTER);
        gtk_window_set_title(GTK_WINDOW(pMainWindow), "MyApplication");
        gtk_window_set_default_size(GTK_WINDOW(pMainWindow), 640, 480);
        gtk_container_set_border_width(GTK_CONTAINER(pMainWindow),20);
     
        g_signal_connect(G_OBJECT(pMainWindow), "destroy", G_CALLBACK(onDestroyWindow), NULL);          // "destroy" est émis lorsque l'objet est détruis
        g_signal_connect(G_OBJECT(pMainWindow), "delete-event", G_CALLBACK(onDeleteEventWindow), NULL); // "delete_event" est émis quand l'utilisateur veut détruire un objet
     
     
        // Build Buttons
        pQuitBtn = gtk_button_new_from_stock(GTK_STOCK_QUIT);
        g_signal_connect(G_OBJECT(pQuitBtn), "clicked", G_CALLBACK(onClickedQuit), NULL);
     
        pConnectBtn = gtk_button_new_with_mnemonic("_Connect");
        g_signal_connect(G_OBJECT(pConnectBtn), "clicked", G_CALLBACK(onClickedConnect), NULL);
     
        pLoadBtn = gtk_button_new_with_mnemonic("_Load File");
        g_signal_connect(G_OBJECT(pLoadBtn), "clicked", G_CALLBACK(onClickedLoad), NULL);
     
        pSaveBtn = gtk_button_new_with_mnemonic("_Save File");
        g_signal_connect(G_OBJECT(pSaveBtn), "clicked", G_CALLBACK(onClickedSave), NULL);
     
        pTable = gtk_table_new(6, 2, TRUE);
        gtk_container_add(GTK_CONTAINER(pMainWindow), pTable);
        gtk_table_attach(GTK_TABLE(pTable), pConnectBtn,     0, 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 0, 0);
        gtk_table_attach(GTK_TABLE(pTable), pQuitBtn,        1, 2, 1, 2, GTK_EXPAND, GTK_EXPAND, 0, 0);
        gtk_table_attach(GTK_TABLE(pTable), pLoadBtn,        0, 1, 3, 4, GTK_EXPAND, GTK_EXPAND, 0, 0);
        gtk_table_attach(GTK_TABLE(pTable), pSaveBtn,        1, 2, 3, 4, GTK_EXPAND, GTK_EXPAND, 0, 0);
     
     
        // Display and event loop
        gtk_widget_show_all(pMainWindow);
     
        gtk_main();
     
        // exit
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
    Test.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    void onDestroyWindow(GtkWidget *pWidget, gpointer data);
    gboolean onDeleteEventWindow(GtkWidget *pWidget, gpointer data);
    void onClickedQuit(GtkWidget *pWidget, gpointer data);
    void onClickedConnect(GtkWidget *pWidget, gpointer data);
    void onClickedLoad(GtkWidget *pWidget, gpointer data);
    void onClickedSave(GtkWidget *pWidget, gpointer data);
     
    #endif // TEST_H_INCLUDED
    Test.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
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    void onDestroyWindow(GtkWidget* pWidget, gpointer data)
    {
        gtk_main_quit();
    }
     
    gboolean onDeleteEventWindow(GtkWidget* pWidget, gpointer data)
    {
        GtkWidget *pDialog = NULL;
        gboolean ContinueFlag = TRUE;
     
     
        pDialog = gtk_message_dialog_new(GTK_WINDOW(pWidget),
                                         GTK_DIALOG_MODAL,
                                         GTK_MESSAGE_QUESTION,
                                         GTK_BUTTONS_YES_NO,
                                         "Are you sure you want to quit?");
     
        switch(gtk_dialog_run(GTK_DIALOG((GtkWidget*)pDialog)))
        {
            case GTK_RESPONSE_YES:
            {
                gtk_main_quit();
                ContinueFlag = FALSE;
                break;
            }
     
            case GTK_RESPONSE_NO:
            {
                gtk_widget_destroy(pDialog);
                break;
            }
        }
     
        return ContinueFlag;
    }
     
    void onClickedQuit(GtkWidget *pWidget, gpointer data)
    {
        GtkWidget *pQuitBox = NULL;
     
     
        pQuitBox = gtk_message_dialog_new(NULL, //GTK_WINDOW(pWidget),
                                         GTK_DIALOG_MODAL,
                                         GTK_MESSAGE_QUESTION,
                                         GTK_BUTTONS_YES_NO,
                                         "Are you sure you want to quit?");
     
        //gtk_window_set_title(GTK_WINDOW(pQuitBox), "Question");
        //gtk_window_set_position(GTK_WINDOW(pQuitBox), GTK_WIN_POS_MOUSE);
     
        switch(gtk_dialog_run(GTK_DIALOG(pQuitBox)))
        {
            case GTK_RESPONSE_YES:
            {
                gtk_main_quit();
                break;
            }
     
            case GTK_RESPONSE_NO:
            case GTK_RESPONSE_NONE:
            default:
            {
                gtk_widget_destroy(pQuitBox);
                break;
            }
        }
    }
     
    void onClickedConnect(GtkWidget* pWidget, gpointer data)
    {
        printf("CONNECT button pushed\n");
    }
     
    void onClickedLoad(GtkWidget* pWidget, gpointer data)
    {
        printf("LOAD button pushed\n");
    }
     
    void onClickedSave(GtkWidget* pWidget, gpointer data)
    {
        printf("SAVE button pushed\n");
    }

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    Bonjour !
    As-tu ajouté le fichier test.c au projet ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Oui bien sur, ils apparaissent tous dans l'arbre du workspace.

    Mais le problème vient bien de ce fichier, car j'ai testé la manip' suivante:

    Si je place les prototypes des fonctions dans "Test.h", que j'ajoute #include "Test.h" en tête du fichier main.c et que je déclare le corps des fonctions dans le main.c, après la fonction main() => ça fonctionne

    Mais si tôt que je déclare le corps des fonctions dans le Test.c, je me retrouve avec les erreurs précédentes

  4. #4
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    mmh...
    En faisant clic droit sur le fichier, onglet build, tout est bien coché ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Citation Envoyé par germinolegrand Voir le message
    mmh...
    En faisant clic droit sur le fichier, onglet build, tout est bien coché ?
    Oui tout est bien coché.

    Je viens de trouver mon erreur.

    En fait je travaille sur un MAC, sous Parallel pour avoir l'environnement Windows. Code::Blocks est installé sous windows car mon application est destinée à un PC sous windows. Donc dans l'environnement Windows (Parallel), j'ai installé la librairie GTK+, sur le hdd c: , hors mon répertoire de travail était sur le disque y: (Mac)...

    J'ai déplacé mon répertoire de travail sur le c:, et désormais tout fonctionne

    Il faut désormais que je trouve, ou je peux indiquer dans code::blocks, les répertoire ou il doit faire ses recherches de fichiers lors de la compile/link...

    Merci pour ton aide

  6. #6
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    Très simple (une fois qu'on le sait) : Build Options, choix de la target, Search directories, Compiler ou Linker.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "undefined reference to" fonction sous code::blocks
    Par Lerrak dans le forum Langage
    Réponses: 4
    Dernier message: 10/06/2014, 14h35
  2. Undefined reference avec code blocks
    Par Airlink dans le forum Débuter
    Réponses: 1
    Dernier message: 14/06/2008, 19h40
  3. Réponses: 2
    Dernier message: 23/04/2007, 22h37
  4. [kjAPI] Compilation avec Code::Blocks
    Par ThomasCh dans le forum Moteurs 3D
    Réponses: 5
    Dernier message: 17/10/2006, 09h01
  5. [débutant]impossible d'éxecuter avec Code::blocks!
    Par Antigonos Ier Gonatas dans le forum Code::Blocks
    Réponses: 6
    Dernier message: 31/05/2006, 19h53

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