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的回答不正確。 ksp0422顯示了用於在前一個makefile中編譯目標文件的方法。據推測,還有一個類似的連接線,沒有顯示。所以他沒有比較編譯和鏈接。在新的makefile中,他依靠make的內置規則進行編譯,而在舊的makefile中,他爲每個對象創建了顯式編譯規則。 – MadScientist
@MadScientist琢磨更多,我認爲你是對的。 –