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.