2013-12-14 183 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