c - Makefile:从 .c 文件编译 .o

标签 c makefile

我对 Makefile 没有太多经验,所以答案可能很明显。但是,我无法在 GNU make 手册或 stackoverflow 的其他地方找到我要找的东西。我遇到过几次这个问题,所以我做了一个示例项目来演示它。

我有目录:

  • .c 文件的 src/
  • build/用于正在构建的库
  • obj/用于所有 .o 文件(一个是从不同项目编译的)

它的样子:

$ ls -l
total 0
drwxrwxr-x+ 1 sam None 0 Jan  5 15:43 build
drwxrwxr-x+ 1 sam None 0 Jan  5 15:43 obj
drwxrwxr-x+ 1 sam None 0 Jan  5 15:42 src

我的生成文件:

CC=gcc
CFLAGS=-Wall

SOURCES=$(wildcard src/*.c)
SOURCE_OBJECTS=$(patsubst src/%.c,obj/%.o,$(SOURCES))

OBJECTS=$(wildcard obj/*.o)

HASHSRC=/cbib/libhash/src/hash.c

TARGET=target.a

all: $(TARGET)

$(TARGET): $(OBJECTS)
    ar rcs $@ $^

obj/%.o: src/%.c
    $(CC) -o $@ $^ $(CFLAGS)

obj/hash.o: $(HASHSRC)
    $(CC) -o $@ $^ $(CFLAGS)

规则

obj/%.o: src/%.c

捕获 obj/目录中的所有 .o 文件。但是我只希望它捕获 SOURCE_OBJECTS 中列出的文件,并从 src/目录中的相应文件编译它们。我该怎么做?

最佳答案

OBJECTS=$(wildcard obj/*.o) 为空,因为 wildcard只返回现有文件。您应该依赖 $(TARGET) 中的 $(SOURCE_OBJECTS)

处理多个输入源时,您可以 narrow down the selection :

# dest files        dest pattern  source pattern
$(SOURCE_OBJECTS):  obj/%.o:      src/%.c
    $(CC) -o $@ $^ $(CFLAGS)

Makefile 中还有其他小错误(或缺点)。例如。谁创建目录 obj/?为此,您可以 depend在如下目录中:

obj/%.o: | obj/

obj/:
    mkdir -p $@

关于c - Makefile:从 .c 文件编译 .o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621364/

相关文章:

c - 在三个管道之间传输消息

在 C 中通过 HTTP 连接到网站

c - Embox 编译和烧写

c - OpenGL 正射投影被破坏

c++ - 更改时 Make 不会重建 header

c - 在 C 中遍历二维数组

c - 构建库时遇到问题

c++ - 具有来自不同 header 的模板类的类将无法编译

c++ - 头文件依赖不起作用

docker - Makefile - 包罗万象的目标