2014-10-16 66 views
0

我有大量的小C程序(所有单个.c文件),我想将它们全部构建到单独的可执行文件中。也就是说,prog-01.c,prog-02.c等应该单独构建,结果应该是该程序的单个可执行文件。在makefile中批量构建源代码

我在makefiles中使用通配符相对比较新,我很感谢一些帮助。这是我到目前为止已经完成:

CC = gcc 
CFLAGS = -g -Wall -Werror 

SRCS:=$(wildcard *.c) 
OBJS:=$(SRC:.c=.bin) 

all-gcc: $(SRCS) 
    $(CC) $(CFLAGS) $(SRCS) -o $(OBJS) 

run-%-gcc: prog-%-gcc 
     @./$(<) 

prog-%-gcc: prog-%.c 
     $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    @rm *.o 

回答

1

如果我走这条路,我可能会使用:

CC  = gcc 
CFLAGS = -g -Wall -Werror 

SRCS := $(wildcard *.c) 
PROGS := $(SRCS:.c=) 
OBJS := $(SRCS:.c=.o) 

all: $(PROGS) 

clean: 
    rm -f $(OBJS) $(PROGS) 

这每一个文件program.c转换成可执行program,使用默认规则从C源文件构建一个程序。

+0

哇,这很好!你能详细解释一下这里发生了什么吗? – audiFanatic 2014-10-17 04:48:41

+0

你知道通配符是如何工作的,生成一个以'.c'结尾的文件名列表。下一个分配会创建一个名称列表,其中'.c'后缀被一个空字符串替代,有效地删除'.c'。这些被认为是制作的节目。当然,'make'知道如何从一个C源文件创建一个程序。当所有程序都是最新的时候,所有的目标都是最新的。因此,标准的内置规则负责所有的艰苦工作。 OBJS宏包含目标文件名,假设你在Unix上。 'clean'目标删除程序和目标文件。 – 2014-10-17 05:31:59

+0

啊,这就是我没有得到的;我没有意识到make可以自动构建没有明确规则的东西。在那种情况下,我将如何修改这个以使用明确的规则?我需要制定另一条规则来同时运行所有这些规则?使用'./$(PROGS)'只运行第一个程序,然后将其他参数作为参数。 – audiFanatic 2014-10-17 14:46:34