GTK+ gcc: undefined reference to tous gtk fonctions lors de la liaison
Je code une interface avec GTK+ pour discuter en utilisant le protocole XMPP.
Mon code a bien fonctionné lorsque j'ai compilé comme :
gcc login_gtk.c `pkg-config --cflags --libs gtk+-3.0`
Mais depuis que j'ai ajouter mon fichier de mon projet, et je suis à l'aide d'un Makefile, il ne compile pas plus. Je suppose que le problème vient de mon Makefile.
Des erreurs du compilateur :
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
Et une partie de login_gtk.c:
#include <gtk/gtk.h>
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);
}
OriginalL'auteur BoilingLime | 2013-06-15
Vous devez vous connecter pour publier un commentaire.
L'ordre est faux: c'est un incroyablement commune erreur que je rencontre. Les versions précédentes de
gcc
étaient moins pointilleux sur l'argument de l'ordre et de la propagation de l'idée faussepkgconfig --cflags --libs
fonctionne dans toutes les positions.Découvrez cet e-mail pour des informations sur les indicateurs appropriés de la commande. En bref:
pkg-config
insérer. Debian me permet de faire les gccpkg-config --blah
test.c, mais en effet, MSYS2/mingw-w64
il faut gcc test.cpkg-config --blah
...OriginalL'auteur ntd
Vous n'avez pas inclus les bibliothèques dans votre Makefile.
Vous devez ajouter
-L<path to your lib directory
et-lgtk+-3.0
à votre linker ligne.CLFAGS
manque ici ...ou ici:
$(shell pkg-config --cflags --libs gtk+-3.0)
Mais votre linker ligne montre que cela n'arrive pas. La première ligne de vos erreurs de compilateur ne montre rien sur les bibliothèques. Dans votre éditeur de liens en ligne vous ne passez pas le CFLAGS.
Il fait le travail, j'ai édité le post. J'ai ajouté de la première ligne de la compilation. Mais je devine juste une commande de l'émetteur dans le processus de liaison.
Comme
gcc login_gtk.c $(pkg-config --cflags --libs gtk+-3.0)
fonctionne. Maisgcc $(pkg-config --cflags --libs gtk+-3.0) login_gtk.c
ne fonctionne pas. Mais je ne sais pas comment gérer ce comportement dans mon MakefileOui, cela aurait été mon prochain deviner, mais depuis votre ligne n'a pas le montrer, il était apparemment une chose évidente. Si ça marchait avant, alors pourquoi ne pas regarder ce qui est différent maintenant dans votre éditeur de liens en ligne?
OriginalL'auteur Devolus
J'ai enfin arriver à compiler en faisant cette chose que le Makefile :
Je n'ai pas compris de cette façon. Mais en réalité, je ne suis pas vraiment convaincu par ce moyen, parce que je vais havve beaucoup de c de fichiers à compiler avec l'librabry. Et je ne vais pas toutes les mettre ! C'est sale.
Vous pouvez écrire un makefile de la règle, de sorte que vous n'avez pas à modifier si vous avez besoin d'ajouter un nouveau fichier source. Aussi vous n'avez probablement pas depencies inclure les modifications apportées au fichier. Vous pouvez prendre un coup d'oeil ici, où j'ai posté mon travail makefile comme un exemple: stackoverflow.com/questions/16084456/...
OriginalL'auteur BoilingLime