2013-08-07 55 views
0

我正在爲使用C語言編寫的gtk應用程序編寫代碼,並且對此有一些疑問。Makefiles如何正確工作

# Compiler 
CC = gcc 
CFLAGS = -Wall -g -o 
RM = rm -f 

# ADDITIONAL HEADER PATH 
GTKINC = `pkg-config --cflags gtk+-3.0` 
GTKLIB = `pkg-config --libs gtk+-3.0` 

INC = $(GTKINC) 
LIBLNK = $(GTKLIB) 


# SOURCES, OBJECTS, EXECUTABLE 
SRCS = hello.c 
OBJS = $(SRCS:.c = .o) 
EXEC = hello 

.PHONY: clean 

all: $(EXEC) 
    @echo compile complete 

$(EXEC): $(OBJS) 
    $(CC) $(INC) $(CFLAGS) $(EXEC) $(OBJS) $(LIBLNK) 

clean: 
    $(RM) *.o *~ $(EXEC) 

以前,當我寫Makefile中,我添加的行爲每個對象文件

例如

blah blah 

a.o: 1.h A.c B.c 
     $(CC) blah blah 
blah blah 

,然後,我有點懶,試圖做使事情更容易修改文件 googling up,最後產品就是上面的代碼。 1.這是否與我以前做過的事情相同(如下例所示) 我發現代碼編譯正確,但我不確定它是否檢查過期的 目標文件。這是'make'的全部含義)
2.你必須使用'depends'在頭文件中以檢查過時的源文件嗎? 3.它有點出題,但 gcc -o hello.o hello.h hello.c和 gcc -c hello.c有什麼區別?

回答

1

2.你必須在頭文件中使用「依賴」,以檢查出過期的源文件

你應該自動生成的頭文件的依賴性。請參閱https://stackoverflow.com/a/9598716/412080

+0

我認爲您對#1的回答不正確。 ksp0422顯示了用於在前一個makefile中編譯目標文件的方法。據推測,還有一個類似的連接線,沒有顯示。所以他沒有比較編譯和鏈接。在新的makefile中,他依靠make的內置規則進行編譯,而在舊的makefile中,他爲每個對象創建了顯式編譯規則。 – MadScientist

+0

@MadScientist琢磨更多,我認爲你是對的。 –