如何使用make更高效地编译c文件

Posted

技术标签:

【中文标题】如何使用make更高效地编译c文件【英文标题】:How to compile c files more efficent with make 【发布时间】:2016-07-12 19:05:17 【问题描述】:

我目前正在编写一个玩具操作系统。由于有很多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)

编辑:我正在考虑使用通配符完成此操作的方式

【问题讨论】:

请说一下这个不工作的原因,以便我们学习如何修复。 关于make 的最佳建议是获取一个大型OSS 项目(来自Github,例如)并研究它的Makefile,当然还有一些文档。你会通过这种方式学到很多东西。回答您的问题:有一种方法可以告诉make .o 文件依赖于具有相同名称和.c 终止的文件,但我只是不记得了。 如果你使用GNU make 然后查找patsubstwildcard 似乎甚至不需要告诉make .o 文件依赖于具有相同名称的.c 文件以及如何构建它们。这是一个内置的规则。在这里阅读更多:gnu.org/software/make/manual/html_node/… 看看musl makefile(musl 有超过 1000 个 .c 文件)。这是我见过的非玩具项目中最干净的 makefile。 【参考方案1】:

通常的方法是从使用$(wildcard ...) 函数给定的特定路径生成*.c 文件列表。

要生成.o 依赖项的对应列表,您可以使用$(patsubst ...) 函数。

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


相关文档:

VPATH Writing Recipes with Directory Search

【讨论】:

以上是关于如何使用make更高效地编译c文件的主要内容,如果未能解决你的问题,请参考以下文章

如何写 makefile

GruntJS学习(转)

如何正确设置项目的 make 文件?

Linux下使用make install安装的软件如何卸载

学习总结:工程管理与makefile

如何在 Mac OS X 终端上使用 make 编译 C 程序