为相对较大的 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)
程序树:
├── 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
制作这些应用程序的最佳方法是为您引入的每个对象或库添加编译说明
如添加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)