2013-12-08 53 views
1

我正在閱讀GTK +的基礎知識,因此決定編寫一個簡單的makefile,讓我運行「make」來編譯我剛剛編寫的示例程序。我還偶然發現Gnome團隊指定的編譯器指令列表here將幫助從GTK2轉移到GTK3,所以我想包括這些。使用Makefile的額外CFLAG

我爲所有意圖和目的的化妝菜鳥,所以這是我想出了:

CC   = gcc 
CFLAGS  += -Wall 
GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE 
GTK_CFLAGS = $(shell pkg-config --cflags gtk+-3.0) 
GTK_LDFLAGS = $(shell pkg-config --libs gtk+-3.0) 

%.o: %.c 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) -c -o [email protected] $< 

%: %.o 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o [email protected] $< 

.PHONY: clean 

clean: 
    rm -f *.o *~ 

正如你可能已經猜到,這是行不通的完全正確。我知道在makefile中運行pkg-config並不是一個理想的解決方案,但是這對於我的小型學習項目而言並不適用於任何類型的部署。也就是說,輸出對我來說很奇怪,看起來好像在CFLAGS之後忽略任何變量。

喜歡的東西:

[[email protected] ch2]$ make helloworld 
gcc -Wall helloworld.c -o helloworld 
helloworld.c:1:21: fatal error: gtk/gtk.h: No such file or directory 
#include <gtk/gtk.h> 
        ^
compilation terminated. 
<builtin>: recipe for target 'helloworld' failed 
make: *** [helloworld] Error 1 

如果我添加有GTK_DFLAGS的內容只是上漲到CFLAGS結束,他們似乎在命令行上,但pkg配置變量仍下落不明。

很明顯,我搞砸了一些簡單的東西,但經過一小時含糊糊糊的谷歌搜索之後,我對它是什麼有了新的想法。

+0

此外,我很高興有什麼_else_我做錯了指出。 =) – musasabi

+1

我沒有看到任何明顯的錯誤,我的頭頂。我建議在'$(shell ...)'的行上使用':='而不是'='。但是,只有獲得錯誤纔會導致對'pkg-config'的額外調用,這只是'make'期間的一個性能問題。不是造成這個問題的根本原因。 –

+0

啊哈......我明白髮生了什麼事。你的主要目標是'helloworld',你直接從'helloworld.c'文件編譯它,而不是鏈接'helloworld.o'文件。你的'helloworld'目標是什麼樣的? –

回答

0

你需要在你的Makefile中有一個helloworld的目標。類似這樣的:

helloworld: helloworld.o 
    $(CC) -o helloworld helloworld.o $(LDFLAGS) $(GTK_LDFLAGS) 
+1

但是,如果我只是想製造我提供給它的任何東西?例如,「make helloworld」用提供的指令編譯helloworld.c,但「make foo」會用相同的指令編譯foo.c。 – musasabi

+0

如果您的可執行文件只能由一個源文件創建,那麼您的'%:%.o'規則應該覆蓋它。我的記憶在這裏很模糊,但我相信這些模式規則在雙方都需要一個後綴,這是規則缺乏的。 –

+1

是的,我解決了它。我錯誤地理解了宏。請參閱下面的答案。 =) – musasabi

1

找到了答案,當然,當我問這個問題/做更早的搜索時,我錯過了詞彙表。

CC   = gcc 
CFLAGS  += -Wall -std=c11 
GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE 
GTK_CFLAGS := $(shell pkg-config --cflags gtk+-3.0) 
GTK_LDFLAGS := $(shell pkg-config --libs gtk+-3.0) 

%: %.c 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o $* $*.c 

.PHONY: clean 

clean: 
    rm -f *~ 

此我想要做什麼,這是編譯任何名稱的一個.c文件與GTK標誌我一直在尋找使用相同名稱的計劃。

感謝那些貢獻!

+1

您應該將規則寫爲'%:%.c'。如果您不提供先決條件,那麼在修改源文件時不會重新生成您的程序,這使得首先使用makefile毫無用處。 – MadScientist

+1

啊,果然!在告訴我目標是最新的之後,我對makefile進行了更改,但是我忘記在這裏做出更改。這樣做! =) – musasabi