GTK + gcc:链接时对所有gtk函数的未定义引用

我正在用GTK +编写一个接口,用于使用XMPP协议进行聊天。 当我编译它时,我的代码运行正常:

gcc login_gtk.c `pkg-config --cflags --libs gtk+-3.0` 

但是因为我将我的文件添加到我的项目中,并且我正在使用Makefile,所以它不再编译。 我想问题来自我的Makefile。

编译器错误:

 gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/login_gtk.o Sources/login_gtk.c gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/circular_buffer.o Sources/circular_buffer.c gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/welcome_server.o Sources/welcome_server.c gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/main_loop.o Sources/main_loop.c gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/client_init.o Sources/client_init.c gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/main.o Sources/main.c gcc -o x2p ./Sources/login_gtk.o ./Sources/circular_buffer.o ./Sources/welcome_server.o ./Sources/main_loop.o ./Sources/client_init.o ./Sources/main.o -lexpat ./Sources/login_gtk.o: In function `login_form': ./Sources/login_gtk.c:10: undefined reference to `gtk_entry_new' ./Sources/login_gtk.c:11: undefined reference to `gtk_entry_get_type' ./Sources/login_gtk.c:11: undefined reference to `g_type_check_instance_cast' ./Sources/login_gtk.c:11: undefined reference to `gtk_entry_set_text' ./Sources/login_gtk.c:12: undefined reference to `gtk_box_get_type' ./Sources/login_gtk.c:12: undefined reference to `g_type_check_instance_cast' ./Sources/login_gtk.c:12: undefined reference to `gtk_box_pack_start' ./Sources/login_gtk.c:13: undefined reference to `gtk_entry_get_type' ./Sources/login_gtk.c:13: undefined reference to `g_type_check_instance_cast' 

Makefile文件:

 NAME = x2p SRCS = \ ./Sources/login_gtk.c \ ./Sources/circular_buffer.c \ ./Sources/welcome_server.c \ ./Sources/main_loop.c \ ./Sources/client_init.c \ ./Sources/main.c \ OBJS = $(SRCS:.c=.o) CC = gcc -o CFLAGS = -W -Wall -Wextra -Werror -g -I./Includes/. $(shell pkg-config --cflags --libs gtk+-3.0) LDFLAGS += -lexpat RM = rm -f CAR = *\# *~ *core* all : $(NAME) $(NAME) : $(OBJS) $(CC) $(NAME) $(OBJS) $(LDFLAGS) clean : $(RM) $(OBJS) $(CAR) fclean : clean $(RM) $(NAME) re : fclean all 

和login_gtk.c的一部分:

 #include  void location_form(GtkWidget *pVBox) { GtkWidget *pList; pList = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pList), "LOCATION"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pList), "WORK"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pList), "HOME"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pList), "SCHOOL"); gtk_combo_box_set_active(GTK_COMBO_BOX(pList), 0); gtk_box_pack_start (GTK_BOX(pVBox), pList, FALSE, TRUE, 0); } 

订单是错误的 :这是我继续遇到的一个非常常见的错误。 以前版本的gcc在参数顺序上不那么挑剔,这传播了错误的想法pkgconfig --cflags --libs在每个位置都有效。

查看此电子邮件 ,了解有关正确标记订购的信息。

您尚未在Makefile中包含库。

您必须将-L-lgtk+-3.0到链接器行。

CLFAGS在这里失踪了......

 $(NAME) : $(OBJS) $(CC) $(NAME) $(OBJS) $(LDFLAGS) 

或者在这里:

 LDFLAGS += -lexpat 

我终于通过做Makefile这个东西来编译:

 NAME = x2p SRCS = \ ./Sources/circular_buffer.c \ ./Sources/welcome_server.c \ ./Sources/main_loop.c \ ./Sources/client_init.c \ ./Sources/main.c \ OBJS = $(SRCS:.c=.o) LLFLAGS = $(shell pkg-config --cflags --libs gtk+-3.0) CC = gcc O = -o CFLAGS = -W -Wall -Wextra -Werror -g -I./Includes/. LDFLAGS += -lexpat RM = rm -f CAR = *\# *~ *core* all : $(NAME) $(NAME) : $(OBJS) $(CC) -I./Includes/. ./Sources/login_gtk.c $(LLFLAGS) $(O) $(NAME) $(OBJS) $(LDFLAGS) clean : $(RM) $(OBJS) $(CAR) fclean : clean $(RM) $(NAME) re : fclean all