我正在尝试编写一个 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 机器编译它。
谢谢你的建议。
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.o
,2.o
并且3.o
从制作手册:
$^ 所有先决条件的名称,它们之间有空格。对于存档成员的先决条件,仅使用命名的成员(请参阅存档)。目标对其依赖的每个其他文件只有一个先决条件,无论每个文件被列为先决条件多少次。因此,如果您为某个目标多次列出先决条件,则 $^ 的值仅包含该名称的一个副本。此列表不包含任何仅订购的先决条件;对于那些看到 `$|' 变量,下面。
$@ 规则目标的文件名。如果目标是存档成员,则“$@”是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介),“$@”是导致规则配方运行的目标的名称。