2

我正在尝试编写一个 makefile,它应该从 src/ 中选择源代码,并从 inc/ 中选择头文件

~/Linuz/src: 1.c, 2.c, 3.c ...

~/Linuz/inc: abc.h, dyz.h

请帮我创建一个makefile,它应该可以在

~/Linuz/some_other_dir/Makefile

PS:尝试为我的 linux 机器编译它。

谢谢你的建议。

4

1 回答 1

5
all: my_program

%.o: ../src/%.c
    $(CC) $(CFLAGS) -I../inc/ -c -o $@ $^

my_program: 1.o 2.o 3.o 
    $(CC) $(LDFLAGS) -o $@ $^

clean:
    rm -f *.o my_program

如果您将 Makefile 放在~/Linuz/some_other_dir/中,则以下规则

%.o: ../src/%.c

将从文件../src/夹 ( ~/Linuz/src/ ) 中获取 c 文件,并在 Makefile 的同一文件夹中创建对象 (*.o) 文件。

-I../inc/选项意味着 makefile 可以从../inc/文件夹 ( ~/Linuz/inc/ ) 中获取头文件。

my_program: 1.o 2.o 3.o规则意味着 makefile 将在 Makefile 的同一目录中从目标文件创建二进制文件1.o2.o并且3.o

制作手册

$^ 所有先决条件的名称,它们之间有空格。对于存档成员的先决条件,仅使用命名的成员(请参阅存档)。目标对其依赖的每个其他文件只有一个先决条件,无论每个文件被列为先决条件多少次。因此,如果您为某个目标多次列出先决条件,则 $^ 的值仅包含该名称的一个副本。此列表不包含任何仅订购的先决条件;对于那些看到 `$|' 变量,下面。

$@ 规则目标的文件名。如果目标是存档成员,则“$@”是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介),“$@”是导致规则配方运行的目标的名称。

于 2013-03-18T11:18:25.417 回答