如何使Makefile查找目录中的所有.c文件,然后为每个单独的文件构建对象文件?

时间:2018-05-22 14:01:32

标签: gcc makefile

如何让makefile找到名为lib的目录中的所有.c文件,然后为每个.c文件(在gcc中)构建单独的目标文件?假设lib目录中有两个文件foo.c和bar.c,如何让makefile检测目录中的所有.c文件,然后构建目标文件(在这种情况下为foo.o和bar.o)对于他们在构建目录中?

1 个答案:

答案 0 :(得分:0)

我假设你正在使用(特别是)GNU make(我想你是在一些POSIX系统,也许是Linux)。花几个小时来阅读documentation

然后你可能有

 SRCFILES:= $(wildcard */*.c)

(你可以使用=而不是:=,你应该阅读有关它们之间差异的文档)或者(当然你应该避免像文件路径中的空格那样奇怪的字符)

 SRCFILES:= $(shell find -type f -name '*.c')

您可以考虑定义

 OBJFILES:= $(patsubst %.c,%.o,$(SRCFILES))
BTW,对于几十万行源代码的小项目,使用平面源树更方便。请参阅this回答。还要了解现有free software项目Makefile的灵感,例如在github

我不确定对于您的小项目,将目标文件放在一个单独的目录中是值得的。

通过研究make

的输出,了解make -p的内置规则

在几年内,当您的项目变得更大时,您可能需要一些时间来重构它并改进构建。

另请阅读Recursive Make considered harmful(可能有争议,但肯定有趣的意见)

考虑使用make --trace和/或remake-x一起调试Makefile

您可能(但我不喜欢小项目......)生成您的Makefile(例如使用autoconfcmake)或使用其他build automation工具ninja(也许是meson)。

顺便说一句,如果lib/包含某个库的代码,请阅读Program Library HowToHow To Write Shared Libraries

由于您使用GCCmake,请阅读Invoking GCC

一章