2013-12-14 138 views
2

我试图编译和链接从网上下载的简单程序,以了解如何使用gtk+库来制作GUI。GTK +编译未定义参考C

这里是我的makefile:

CC = gcc 
BIN = gtk_led 
SRC = main.c gtkled.c 
OBJ = main.o gtkled.o 

CPPFLAGS =-Wall -W -ansi -pedantic -O2 `pkg-config --cflags gtk+-2.0` 

LDFLAGS = `pkg-config --libs gtk+-2.0` 

all: $(BIN) 

$(BIN): $(SRC) 
$(CC) $(CPPFLAGS) -c $(SRC) 
$(CC) $(LDFLAGS) -o $(BIN) $(OBJ) 

clean: 
rm -f *.o *~ core $(BIN) 

当我做make,构建失败,出现以下错误:

gtkled.o: In function `gtk_led_size_allocate': 
gtkled.c:(.text+0x43a): undefined reference to `g_return_if_fail_warning' 
gtkled.c:(.text+0x487): undefined reference to `gdk_window_move_resize' 
gtkled.o: In function `gtk_led_size_request': 
gtkled.c:(.text+0x4f5): undefined reference to `g_return_if_fail_warning' 

所以我不明白为什么....我新的Linux,所以这对我来说很难:) (在Ubuntu上,使用virtualBox)

谢谢。

+0

这将是更好地显示“make”正在为您运行的命令... –

+0

请勿在编译器标志中使用-ansi -pedantic。它们完全没有用处,或者最糟糕的是误导和错误。使用-Wall -Wextra,如果你想从GCC获得一系列现代编译器警告。或者,查看gcc手册页并选择对您的代码库有意义的警告。 – ebassi

回答

2

不要在Makefile-s中使用反引号(但使用GNU make的shell function)。而GTK2已经过时,为什么不使用GTK3?

更换至少两条线CPPFLAGSLDFLAGS

PACKAGES= gtk+-3.0 
OPTIMFLAGS=-g # put -O2 when all is ok 
PKG_CFLAGS= $(shell pkg-config --cflags $(PACKAGES)) 
CPPFLAGS =-Wall -W -ansi -pedantic $(OPTIMFLAGS) $(PKG_CFLAGS) 
LDFLAGS = $(shell pkg-config --libs $(PACKAGES)) 

顺便说一句,你大概的意思CFLAGS没有CPPFLAGS。运行make -p以了解make已知的内置规则是什么;又见this answerthat answer一些相关的问题...

而且,参数gcc顺序是相当重要的,所以

$(CC) $(LDFLAGS) -o $(BIN) $(OBJ) 

是错误的,你可能想

$(CC) $(OBJ) $(LDFLAGS) -o $(BIN) 
+0

感谢您的回答, 但是,这不工作...:/ 我不知道我需要有一个复杂的生成文件。 我发现它的源代码。 但我只有main.c文件和许多库。 没有用这样的东西来编译这一个简单的方法: 所有:你好 你好:hello.o main.o \t的gcc -o你好hello.o main.o hello.o: hello.c的 \t的gcc -o hello.o -c hello.c的-W -Wall -ansi -pedantic main.o:main.c中hello.h \t的gcc -o main.o -c main.c中 - w^-Wall -ansi -pedantic 清洁: \t室射频*的.o mrproper:清洁 \t rm -rf你好 对不起,但我真的不明白makefile .... 谢谢! :) – TGuerin

+0

什么不起作用?显示'make'运行的确切命令。是的,在为GTK编写代码时,你真的想学习如何编写'Makefile'-s(或者在终端中输入单一命令来构建你的应用程序,或者编写一个shell脚本),因为你会很快就会为你的GTK应用程序提供几个源文件。 –

+0

谢谢!这是通过使用 $(CC)$(OBJ)$(LDFLAGS)-o $(BIN) 非常感谢! :)) – TGuerin