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.