gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:15 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com