5

我目前正在学习 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

或者我的代码是否适合我想要它做的事情?

4

5 回答 5

4

好的,鉴于您正在制作三个不同的程序,makefile似乎没有任何问题。它应该工作。

一些使它更有用的建议:

1) 声明“所有”和“干净”目标是虚假的。这将阻止 Make 尝试制作名为“all”和“clean”的文件。

.PHONY: all clean

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

all: filename1 filename2 filename3

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

于 2012-10-11T02:40:55.760 回答
4

您的 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
于 2012-10-11T02:46:42.257 回答
2

对于从三个文件构建的三个独立程序,您可以简单地使用:

PROGRAMS = filename1 filename2 filename3

all: ${PROGRAMS}

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

您可能会添加:

CFLAGS = -O4

以获得该级别的优化。您可以使用宏而不是rm命令;一般来说,mature 会makefile使用很多宏:

RM_F = rm -f

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

.PHONY: all clean

而这样的例子不胜枚举。

关键是它已经make知道如何构建单文件程序,并且它知道如何将 C 源代码编译为目标文件,因此您不必训练它来做到这一点。

于 2012-10-11T02:47:03.650 回答
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
于 2012-10-11T02:51:39.443 回答
0

FWIW,

高温高压

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

Makefile编译多个c程序?

于 2012-12-04T10:40:26.103 回答