C++ 如何用make更有效地编译c文件

C++ 如何用make更有效地编译c文件,c++,c,makefile,compilation,C++,C,Makefile,Compilation,我目前正在写一个玩具操作系统。由于有许多c文件的gcc命令没有改变(除了文件名),有没有办法自动选择目录中的所有.c文件并编译和链接它们?示例:我创建了一个新文件Example.c 我打电话给 make makefile为我做了一切 我不想使用脚本,只想使用makefile OBJECTS=kasm.o kc.o objects/kb.o objects/screen.o objects/string.o objects/system.o objects/util.o objects/idt.

我目前正在写一个玩具操作系统。由于有许多c文件的gcc命令没有改变(除了文件名),有没有办法自动选择目录中的所有.c文件并编译和链接它们?示例:我创建了一个新文件Example.c 我打电话给

make
makefile为我做了一切

我不想使用脚本,只想使用makefile

OBJECTS=kasm.o kc.o objects/kb.o objects/screen.o objects/string.o objects/system.o objects/util.o objects/idt.o objects/isr.o
ARGS=-ffreestanding
CC=gcc
TARGET=image/boot/kernel.bin

$(TARGET): $(OBJECTS)
    ld -m elf_i386 -T link.ld -o $(TARGET) $(OBJECTS)

kasm.o: kernel.asm
    nasm -f elf32 kernel.asm -o kasm.o

kc.o: kernel.c
    gcc -m32 -c kernel.c -o kc.o $(ARGS)

objects/kb.o: include/kb.c include/kb.h
    gcc -m32 -c include/kb.c -o objects/kb.o $(ARGS)

objects/screen.o: include/screen.c include/screen.h
    gcc -m32 -c include/screen.c -o objects/screen.o $(ARGS)

objects/string.o: include/string.c include/string.h
    gcc -m32 -c include/string.c -o objects/string.o $(ARGS)

objects/system.o: include/system.c include/system.h
    gcc -m32 -c include/system.c -o objects/system.o $(ARGS)

objects/util.o: include/util.c include/util.h
    gcc -m32 -c include/util.c -o objects/util.o $(ARGS)

objects/idt.o: include/idt.c include/idt.h
    gcc -m32 -c include/idt.c -o objects/idt.o $(ARGS)

objects/isr.o: include/isr.c include/isr.h
    gcc -m32 -c include/isr.c -o objects/isr.o $(ARGS)

编辑:我想用通配符来实现这一点。通常的方法是使用函数从给定的特定路径生成
*.c
文件列表

要生成相应的
.o
依赖项列表,可以使用该函数

要编译的规则应该是
%.o:%.c
的内置规则,或者用自己的规则覆盖这些规则。
您还可以使用为更复杂的内容提供模块


相关文件:


请说明这一个如何不起作用,以便我们学习如何修复。关于
make
的最佳建议是获得一个大型OSS项目(来自Github,来自示例)并研究其
Makefile
,当然还有一些文档在手。这样你会学到很多东西。回答你的问题:有一种方法可以告诉
make
.o
文件依赖于同名文件和
.c
终止,但我不记得了。如果你使用的是
GNU
make,那么查找
patsubst
通配符
似乎根本不需要告诉你
make
表示
.o
文件取决于同名的
.c
文件以及如何构建它们。这是一条内在的规则。在这里阅读更多内容:看看(musl有1000多个.c文件)。这是我见过的非玩具项目中最干净的makefile。