具有多个源的C中的Makefile

时间:2012-10-11 02:30:48

标签: c makefile

我目前正在学习C,现在我需要编写Makefile的教程,但我很难为多个源编写Makefile。有人能告诉我如何更正多个源的Makefile代码吗?所有文件都在同一个目录中,共有3个C源文件,如filename1 / 2/3等所示。我试图在一个makefile中构建3个独立的程序,包含3个源文件

 OPT = -O4              

all: filename1

filename1: filename1.o 
    gcc $(OPT) -o filename1 filename1.o

filename1.o: filename1.c
    gcc $(OPT) -c filename1.c

filename2: filename2.o 
    gcc $(OPT) -o filename2 filename2.o

filename2.o: filename2.c
    gcc $(OPT) -c filename2.c   

filename3: filename3.o 
    gcc $(OPT) -o filename3 filename3.o

filename3.o: filename3.c
    gcc $(OPT) -c filename3.c       
clean:
    rm -f *.o
    rm -f filename1
    rm -f filename2
    rm -f filename3

或者我的代码是否符合我的要求?

5 个答案:

答案 0 :(得分:4)

好吧,因为你正在创建三个不同的程序,所以似乎没有任何错误与makefile。它应该工作。

使其更有用的一些建议:

1)声明“全部”和“干净”的目标是虚假的。这将阻止Make尝试创建名为“all”和“clean”的文件。

.PHONY: all clean

2)您可能希望您的“全部”目标构建所有三个程序,而不仅仅是一个程序,因此将其更改为:

all: filename1 filename2 filename3

3)如果您最终使用它来制作三个以上的程序,并且它们都共享相似的构建过程,您可以使用模式匹配将规则折叠为较小的集合。请参阅Martin Beckett的答案。但是,这不是必要的。

答案 1 :(得分:3)

你的makefile应该可以工作,但它可以简化。

make实用程序支持隐式规则。这可以简化常见操作,例如将C源代码文件编译为目标文件并将目标文件编译为可执行文件。

CC=gcc
CFLAGS=-O4

all: filename1 filename2 filename3

%.o: %.c
    $(CC) $(CFLAGS) -c $<

%: %.o
    $(CC) $(CFLAGS) -o $* $<

clean:
    rm -f *.o
    rm -f filename1
    rm -f filename2
    rm -f filename3

答案 2 :(得分:2)

对于由三个这样的文件构建的三个独立程序,您只需使用:

PROGRAMS = filename1 filename2 filename3

all: ${PROGRAMS}

clean:
    rm -f ${PROGRAMS} ${PROGRAMS:=.o}

您可以添加:

CFLAGS = -O4

获得该级别的优化。您可以使用宏而不是rm命令;通常,成熟的makefile使用了很多宏:

RM_F = rm -f

如果你的目标是GNU Make,你可以添加:

.PHONY: all clean

列表继续。

关键是make知道如何构建单文件程序,它知道如何将C源代码编译成目标文件,所以你不必训练它来做那件事。 / p>

答案 3 :(得分:2)

使用模式匹配:

PROGS = filename1 filename2 filename3

all: $(PROGS)

# cancel implicit program rule
%: %.c

%: %.o
    $(CC) $(LDFLAGS) $^ -o $@

%.o: %.c
    $(CC) $(OPT) $(CFLAGS) $^ -c -o $@

clean:
    rm -f $(PROGS) *.o

.PHONY: all clean

答案 4 :(得分:0)

FWIW,

HTH

'用于在$ PWD中构建多个main()目标的通用Makefile'

Makefile to compile multiple c programs?