如何为具有相同依赖关系的多个可执行文件正确编写makefile-C

问题描述 投票:0回答:1

提出问题之前,我想指出,我已经搜索过以前的答案,但是找不到有用的东西。

我正在为考试准备项目。由于它应该包含几个具有各种依赖性的可执行文件,因此我想编写一个简单的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所需的文件。

提前感谢。

c makefile header
1个回答
2
投票

如果您要修改规范并将目标文件与可执行文件分离(编译和链接阶段),可能会更容易。目标文件取决于头文件和源文件,但是可执行文件仅取决于目标文件。然后,如果您正确使用模式规则,自动变量,并且将依赖项与配方分开,则可以使用以下方法:

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以了解更多有关此的信息。

© www.soinside.com 2019 - 2024. All rights reserved.