GTK+ Forums Forum Index GTK+ Forums
Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

undefined reference to

 
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming
Author Message
paragasu
Familiar Face


Joined: 31 Jul 2008
Posts: 44

PostPosted: Wed Oct 01, 2008 6:10 am    Post subject: undefined reference to Reply with quote

I spent half day trying to solve this. I hope someone here can give me a direction.

I have a gtk app with this file in one directory
Code: (Plaintext)
1
2
3
4
5
6
main.c 
data.h - struct / datatypes
loan.c  - function
loan.h - header file for loan.c
menu.c - one function to create gtk window menu
menu.h - header file form menu.c


i created a make file like this

Code: (Plaintext)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

LDFLAGS = `pkg-config --cflags --libs libgnomedb-3.0`

ekoken: main.o menu.o loan.o
    gcc -o ekoken main.o menu.o loan.o $(LDFLAGS)

menu.o: menu.c menu.h data.h
    gcc -c menu.c $(LDFLAGS)

loan.o: loan.c loan.h data.h
    gcc -c loan.c $(LDFLAGS)

main.o: main.c menu.h loan.h data.h
    gcc -c main.c $(LDFLAGS)

clean:
    rm -f *.o ekoken


but when i run $make . i get a bunch of error
Code: (Plaintext)
1
2
3
4

loan.h:3: warning: ‘loan_new_record’ used but never defined
main.c:(.text+0x6de): undefined reference to `loan_display_next_record'


anyone have any idea what i done wrong?

thank you


Last edited by paragasu on Wed Oct 01, 2008 6:34 am; edited 1 time in total
Back to top
paragasu
Familiar Face


Joined: 31 Jul 2008
Posts: 44

PostPosted: Wed Oct 01, 2008 6:33 am    Post subject: this might help Reply with quote

when i do
$ gcc -c main.c `pkg-config --cflags --libs libgnomedb-3.0`

i got

Code: (Plaintext)
1
2
3
4
5
6
7
8
9
loan.h:3: warning: ‘loan_new_record’ used but never defined
loan.h:4: warning: ‘loan_display_reset’ used but never defined
loan.h:5: warning: ‘loan_display_next_record’ used but never defined
loan.h:6: warning: ‘loan_change_view’ used but never defined
loan.h:7: warning: ‘loan_prepare_data’ used but never defined
loan.h:8: warning: ‘loan_find_account’ used but never defined
loan.h:9: warning: ‘loan_payment’ used but never defined
loan.h:10: warning: ‘loan_update_setting’ used but never defined
Back to top
Mk27
GTK+ Guru


Joined: 07 Aug 2008
Posts: 100
Location: NYC

PostPosted: Wed Oct 01, 2008 1:53 pm    Post subject: Reply with quote

This may not be the solution you want, but if the files are so small, can't you just combine loan.h and loan.c?
Back to top
dreblen
Never Seen the Sunlight


Joined: 14 Jun 2007
Posts: 936
Location: Falun, WI USA

PostPosted: Wed Oct 01, 2008 2:47 pm    Post subject: Reply with quote

If it's possible to post your code, it would be a great help.
Thanks...
Back to top
paragasu
Familiar Face


Joined: 31 Jul 2008
Posts: 44

PostPosted: Thu Oct 02, 2008 12:25 am    Post subject: code Reply with quote

here is the code inside loan.h

Code: (C)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <libgnomedb/libgnomedb.h>

static void loan_new_record (gpointer data);
static void loan_display_reset ( GtkWidget *data);
static void loan_display_next_record (gpointer data);
static void loan_change_view (gpointer data);
static void loan_prepare_data(void);
static void loan_find_account(GtkWidget *dialog, gpointer data);
static void loan_payment (GtkWidget *button, gpointer data);
static void loan_update_setting (gpointer data);

GtkWidget *loan_display_image (GdaDataModel *model, gint colno);
GtkWidget *loan_display_account (GdaDataModel *model);


main.c
Code: (C)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200

#include <libgnomedb/libgnomedb.h>
#include <glib/gprintf.h>
#include "data.h"
#include "loan.h"
#include "menu.h"

int main(int argc, char **argv)
{
    GtkWidget *window;
    GdaParameterList *params, *data_set;
    GdaParameter    *param;
    GtkWidget *page1, *page2, *page3, *page4, *page5;
    GtkWidget *hnotebook, *vnotebook;
    GdaDataModelIter *iter;
   
    edb   = g_new0(EkokenDB, 1);
    euser = g_new0(EkokenUser, 1);
    emenu = g_new0(EkokenMenu, 1);
   
    gnome_db_init("ekoken", "1.0", argc, argv);

    GtkWidget *logindlg;
    logindlg = gnome_db_login_dialog_new("EKOKEN MOTOR SND BHD");
    if(!gnome_db_login_dialog_run(GNOME_DB_LOGIN_DIALOG(logindlg))){
        g_print("login cancelled!\n");
        exit(0);
    }


    GdaClient *client;
    GError *error = NULL;

    client = gda_client_new();
    cnc = gda_client_open_connection(client,
    gnome_db_login_dialog_get_dsn(GNOME_DB_LOGIN_DIALOG(logindlg)),
    gnome_db_login_dialog_get_username(GNOME_DB_LOGIN_DIALOG(logindlg)),
    gnome_db_login_dialog_get_password(GNOME_DB_LOGIN_DIALOG(logindlg)),
    GDA_CONNECTION_OPTIONS_DONT_SHARE, &error);

    if(!cnc) {
        g_print("fail to connect to database server\n");
        exit(0);
    }
   
    gtk_widget_destroy(logindlg);

    dict = gda_dict_new();
    gda_dict_set_connection(dict, cnc);
   
    loan_prepare_data();
   

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "EKOKEN MOTOR SND BHD");
    gtk_window_set_icon(GTK_WINDOW(window),
                        gdk_pixbuf_new_from_file("pixmaps/logo.jpg", NULL));
   
    gtk_window_maximize(GTK_WINDOW(window));
    g_signal_connect(GTK_WINDOW(window), "delete-event",
                                    gtk_main_quit, NULL);
   
    gtk_container_set_border_width (GTK_CONTAINER (window), 2);

    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    GtkWidget *menubar = loan_create_menu();
    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
   
    page1 = gnome_db_raw_grid_new(edb->dpage1);

    g_signal_connect (G_OBJECT (page1), "selection-changed",
                            G_CALLBACK(user_struct_update),
                            (gpointer) page1);
   
    g_signal_connect_swapped (G_OBJECT (emenu->next), "clicked",
                                G_CALLBACK (loan_display_next_record),
                              (gpointer) page1);
   
    g_signal_connect_swapped (G_OBJECT (page1), "row-activated",
                              G_CALLBACK (loan_change_view),
                              (gpointer) vnotebook);   
   
    gnome_db_raw_grid_set_sample_start(
                        GNOME_DB_RAW_GRID (page1),
                        100);
   
    /*restrict*/

   
iter = gnome_db_data_widget_get_current_data(
                                GNOME_DB_DATA_WIDGET (page1));
   
    param = GDA_PARAMETER (g_slist_nth_data (
                        GDA_PARAMETER_LIST (iter)->parameters, 0));   
   
    params = gda_data_model_query_get_parameter_list (
                        GDA_DATA_MODEL_QUERY(edb->dacc));
    gda_parameter_bind_to_param (GDA_PARAMETER (params->parameters->data),
                                 param);
   
   
    params= gda_data_model_query_get_parameter_list (
                        GDA_DATA_MODEL_QUERY(edb->dloan));
    gda_parameter_bind_to_param (GDA_PARAMETER (params->parameters->data),
                                 param);
   
    params = gda_data_model_query_get_parameter_list (GDA_DATA_MODEL_QUERY(edb->dpic));
    gda_parameter_bind_to_param (GDA_PARAMETER (params->parameters->data),
                                 param);
   
    params = gda_data_model_query_get_parameter_list (GDA_DATA_MODEL_QUERY(edb->dpay));
    gda_parameter_bind_to_param (GDA_PARAMETER (params->parameters->data),
                                 param);
       
    page2 = gnome_db_raw_form_new(edb->dacc);
    page3 = gnome_db_raw_form_new(edb->dloan);
    page4 = gnome_db_raw_form_new(edb->dpic);
    page5 = gnome_db_raw_grid_new(edb->dpay);
   
    GtkWidget *test = loan_display_account (edb->dacc);
   
   
    data_set= GDA_PARAMETER_LIST (
                 gnome_db_basic_form_get_data_set(
                     GNOME_DB_BASIC_FORM (page4)));
   
    /*
     * GdaParameter *p2param = gda_parameter_list_find_param (data_set, "photo");   
     */
   
GdaParameter *p2param = GDA_PARAMETER (g_slist_nth_data (data_set->parameters, 0));
    g_object_set (G_OBJECT (p2param), "entry_plugin", "picture", NULL);
   
    GtkWidget *photo = loan_display_image (edb->dpic, 0);
   
    vnotebook = gtk_notebook_new();
    hnotebook = gtk_notebook_new();
   
    gtk_notebook_set_tab_pos(GTK_NOTEBOOK(vnotebook), GTK_POS_BOTTOM);
    gtk_notebook_set_show_border(GTK_NOTEBOOK(hnotebook), TRUE);
    gtk_container_set_border_width (GTK_CONTAINER (hnotebook), 5);
   
    GtkWidget *hbox = gtk_hbox_new (FALSE, 5);
    gtk_box_pack_start( GTK_BOX (hbox), page2, FALSE, FALSE, 10);
    gtk_box_pack_start( GTK_BOX (hbox), page3, FALSE, FALSE, 10);
    gtk_box_pack_start( GTK_BOX (hbox), test, FALSE, FALSE, 10);
   
    gtk_notebook_append_page(GTK_NOTEBOOK(vnotebook), page1,
                             gtk_label_new("Browse Account"));
    gtk_notebook_append_page(GTK_NOTEBOOK(vnotebook), hnotebook,
                             gtk_label_new("Account Information"));
   
    gtk_notebook_append_page(GTK_NOTEBOOK(hnotebook), hbox,
                             gtk_label_new("Account"));
   
    gtk_notebook_append_page(GTK_NOTEBOOK(hnotebook), page5,
                             gtk_label_new("Payment"));

    GtkWidget *statusbar = gtk_statusbar_new();   
    gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0);
    gtk_box_pack_end(GTK_BOX(vbox), vnotebook, TRUE, TRUE, 5);
   
    /*callback*/

   
   
g_signal_connect (G_OBJECT (emenu->quit), "activate",
                            G_CALLBACK (gtk_main_quit), NULL);
   
    g_signal_connect (G_OBJECT (emenu->search_acc), "activate",
                            G_CALLBACK (loan_find_account), NULL);
   
    g_signal_connect (G_OBJECT (emenu->about), "activate",
                            G_CALLBACK (rogon_about), NULL);
   
    g_signal_connect (G_OBJECT (emenu->setting), "activate",
                            G_CALLBACK (loan_update_setting), NULL);
   
    g_signal_connect (G_OBJECT (emenu->loan_pay), "activate",
                                G_CALLBACK (loan_payment),
                                (gpointer) window);
   
    g_signal_connect_swapped (G_OBJECT (emenu->new), "activate",
                                G_CALLBACK (loan_new_record),
                                (gpointer) page2);
                             
    g_signal_connect_swapped (G_OBJECT (emenu->refresh), "clicked",
                                G_CALLBACK (loan_display_reset), page1);
   

    /*end of callback section*/
   
   
gtk_widget_show_all(window);
    gtk_main();
   
    gda_connection_close(cnc);
    return 0;
}


Back to top
owl102
GTK+ Geek


Joined: 23 May 2008
Posts: 68

PostPosted: Thu Oct 02, 2008 5:43 am    Post subject: Re: code Reply with quote

paragasu wrote:
here is the code inside loan.h

Code: (C)
1
2
3
4
5
6
7
8
9
10
11
12

...
static void loan_new_record (gpointer data);
static void loan_display_reset ( GtkWidget *data);
static void loan_display_next_record (gpointer data);
static void loan_change_view (gpointer data);
static void loan_prepare_data(void);
static void loan_find_account(GtkWidget *dialog, gpointer data);
static void loan_payment (GtkWidget *button, gpointer data);
static void loan_update_setting (gpointer data);
...


Usually it's not a good idea to do static declarations in a header (*.h) file. If the functions should be exported (so other modules can use them), simply write
Code: (C)
1
2
3
4
5

void loan_new_record (gpointer data);
void loan_display_reset ( GtkWidget *data);
...

(without the "static") in the header file. If they should not be exported, put the above "static" declarations in the code file (*.c) instead, where the implementation can be found, too.

HTH
Back to top
paragasu
Familiar Face


Joined: 31 Jul 2008
Posts: 44

PostPosted: Thu Oct 02, 2008 11:34 am    Post subject: thanks Reply with quote

it works after i remove all the static declaration in the function.

thank owl102
Back to top
Display posts from previous:   
Post new topic   Reply to topic    GTK+ Forums Forum Index -> GTK+ Programming All times are GMT
Page 1 of 1

 


Powered by phpBB © 2001, 2005 phpBB Group
CodeBB 1.0 Beta 2
Protected by Anti-Spam ACP