2013-08-07 50 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琢磨更多,我认为你是对的。 –