将 makefile 与多个 C 程序一起使用

Using makefile with multiple C programs

我在不同的文件中编写了多个 C 程序,我想 运行 同时在同一个 argv 上

所有这三个程序:

这就是我到目前为止所尝试的,但它只是 运行 最后一个程序 digcmp.c:

CC=gcc
a_OBJS=lexcmp.o
b_OBJS=lencmp.o
c_OBJS=digcmp.o
EXEC=lex len dig
DEBUG = -g
CFLAGS = -std=c99  -Wall -Werror $(DEBUG)  #if you have CFLAGS you do not have to write for each file $(CC) -c $*.c!!!

lex: $(b_OBJS)
    $(CC) $(a_OBJS) -o $@


len: $(b_OBJS)
    $(CC) $(b_OBJS) -o $@


dig: $(c_OBJS)
    $(CC) $(c_OBJS) -o $@


lexcmp.o: lexcmp.c
lencmp.o: lencmp.c
digcmp.o: digcmp.c


clean: 
    rm -f lex $(a_OBJS)
    rm -f len $(b_OBJS)
    rm -f dig $(c_OBJS)

make节目有很多implicit rules。事实上,正是它们让您的 lexcmp.o: lexcmp.c(等)规则发挥作用。

您所需要的只是列出使可执行程序本身成为可执行程序的规则:

lexcmp: lexcmp.o
lencmp: lencmp.o
digcmp: digcmp.o

以上内容本身就很好Makefile,如果你运行例如

$ make lencmp

然后 lencmp.c 源文件将被构建到目标文件 lencmp.o 中,然后链接到可执行的 lencmp 程序中。

如果您在构建时需要特定的编译标志,只需设置 CFLAGS 变量即可自动使用。我还推荐一个默认目标,它可能会将所有可执行目标列为依赖项以构建所有这些目标:

CFLAGS = -Wall -Wextra

.PHONY: all
all: lexcmp lencmp digcmp

这应该足以构建带有所需标志的所有可执行文件(跳过 object-file 中间阶段)。

The .PHONY target 告诉 make 它不应该生成名称为 all.

的文件