为相对较大的 C 程序编写 Makefile 的正确方法?

Proper ways to write Makefile for a relatively large C program?

程序树:

├── Makefile
├── foo
├── lib
│   └── foo.h
└── src
    └── foo.c

我想知道是否有正确的方法来编写Makefile来编译这样结构的C程序?就像将所有 .c 文件放在 src 文件夹中,同时将所有头文件放在 lib 文件夹中。

试图为它编写 Makefile,但它没有按预期工作...而且,我试图在 build 文件夹中制作 .o 文件,但我不知道该怎么做。如果我有很多来自 src 和 lib 文件夹的文件,将它们 link 放在一起的正确方法是什么?

我的生成文件:

CC := gcc
CFLAGS := -std=c99 -Werror -Wall
TARGET := foo
LIBDIR := lib
SRCDIR := src
BUILDDIR := build
LIBS = -Ilib
.PHONY: all
.PHONY: clean

all: ${TARGET}

$(TARGET): $(TARGET).c,$(wildcard $(LIBDIR)/ *.h)
    ${CC} ${CFLAGS} ${LIBS} ${SRCDIR}/${TARGET}.c

clean:
    rm -rf $(TARGET)

当我这样做时显示错误 make

make: *** No rule to make target 'foo.c,lib/foo.h', needed by 'foo'.  Stop.

要解决此问题,您需要将 $(TARGET): what,ever

中的逗号替换为 space

制作这些应用程序的最佳方法是为您引入的每个对象或库添加编译说明

如添加files.o

files.o: files.c files.h
   // Compile command

感谢您的宝贵意见!我最终写了这样的部分:

%.o: ${LIBDIR}/%.h
    mkdir ${BUILDDIR}
    ${CC} ${CFLAGS} -c ${LIBDIR}/${TARGET}.h -o ${BUILDDIR}/${TARGET}.o
$(TARGET): $(TARGET).o 
    ${CC} ${CFLAGS} ${LIBS} ${SRCDIR}/${TARGET}.c -o $(TARGET)