提出问题之前,我想指出,我已经搜索过以前的答案,但是找不到有用的东西。
我正在为考试准备项目。由于它应该包含几个具有各种依赖性的可执行文件,因此我想编写一个简单的makefile并正确理解其行为,以便将来在需要时对其进行复制。
假设源文件夹包含以下文件:
handler.c //this is the main file
server.c //another executable
client.c //another executable
header.h //each executable depends from this
header.c
procedure.h //not each executable depends from this
procedure.c
我知道,为了编译这些文件,我应该做类似的事情:
all: handler server client
handler: handler.c header.o procedure.o
gcc handler.c -o handler header.o procedure.o
...more...
procedure.o: header.o
gcc procedure.c -o procedure.o header.o
...more...
这,我不确定一点是正确的,但肯定很繁琐且很长。我的问题是:
鉴于我的问题,是否有更快,简洁,容易的方式来创建这些文件?是否可以对其工作方式进行清楚的说明?
我想指出的是,到目前为止,我将这种类型的makefile用于单个可执行文件,没有问题:
src = $(wildcard *.c)
obj = $(src:.c=.o)
c = gcc
start: $(obj)
$(c) -o $@ $^
clean:
rm -f *.o
rm -f ./start
rm -f *~
我想是从我的主文件夹中取出所有文件,将依赖项指定为file.o的名称,然后创建每个.o所需的文件。
提前感谢。
如果您要修改规范并将目标文件与可执行文件分离(编译和链接阶段),可能会更容易。目标文件取决于头文件和源文件,但是可执行文件仅取决于目标文件。然后,如果您正确使用模式规则,自动变量,并且将依赖项与配方分开,则可以使用以下方法:
SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,%.o,$(SRC))
EXE := handler server client
.PHONY: all clean
all: $(EXE)
# object files to executables dependencies
handler: handler.o header.o procedure.o
server: server.o header.o
client: client.o header.o
# header files to object files dependencies
procedure.o: procedure.h
$(OBJ): header.h
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(EXE):
$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)
clean:
rm -f $(EXE) $(OBJ)
注:当然,由于无法从您的问题中猜测它们,因此请检查依赖项(哪个可执行文件取决于哪个目标文件,哪个目标文件取决于哪个头文件)。此示例Makefile只是一个提示。
注:如Vroomfondel所建议,如果编译器支持它,则还可以使用它来自动检测头文件对目标文件的依赖性。阅读this以了解更多有关此的信息。