如何让makefile找到名为lib的目录中的所有.c文件,然后为每个.c文件(在gcc中)构建单独的目标文件?假设lib目录中有两个文件foo.c和bar.c,如何让makefile检测目录中的所有.c文件,然后构建目标文件(在这种情况下为foo.o和bar.o)对于他们在构建目录中?
答案 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
(例如使用autoconf或cmake)或使用其他build automation工具ninja(也许是meson)。
顺便说一句,如果lib/
包含某个库的代码,请阅读Program Library HowTo和How To Write Shared Libraries。
由于您使用GCC至make
,请阅读Invoking GCC