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:
Par contre, si je regroupe tout dans mon main.c aucun problème, je peux executer et debugger le programme sans problème...
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)
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:
Test.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
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.c
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
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.
Partager