c - MakeFile 的子目录和 GCC 问题
问题描述
我正在makefile
为一个用 C 编写的非常小的个人项目编写一个。
我的项目分为子目录,但是即使(我认为)代码是正确的,也找不到这些 utilme 的指令:
TARGET = example.out
ENV = /usr/bin/env
MKDIR = mkdir
RMV = rm
CP = cp
CC = gcc
CFLAGS = -lm
BINDIR = ./bin
OBJDIR = ./obj
SRCDIR = ./src
SRCS = master.o request/request.o util/util.o # these are all .c files (./src/...)
# ---
.PHONY: build
build: prepare $(SRCS)
$(ENV) $(CC) $(addprefix $(OBJDIR)/, $(SRCS)) -o $(BINDIR)/$(TARGET)
# ---
.PHONY: prepare
prepare:
@$(ENV) $(MKDIR) -p $(BINDIR) $(OBJDIR)
@$(ENV) $(CP) data.txt $(BINDIR)/data.txt
# ---
.PHONY: clean
clean:
@$(ENV) $(RM) -rf $(BINDIR) $(OBJDIR)
# ---
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(ENV) $(CC) $(CFLAGS) -c $<
它说:
make: *** No rule to make target 'master.o', needed by 'build'. Stop.
如果我更改$(OBJDIR)/%.o: $(SRCDIR)/%.c
为%.o: $(SRCDIR)/%.c
,它会说:
make: *** No rule to make target 'request/request.o', needed by 'build'. Stop.
解决方案
您实际上没有从master.o
.master.c
在以下规则中:
$(OBJDIR)/%.o: $(SRCDIR)/%.c
./obj/%.o
不匹配master.o
如果master.c
在src
(如注释所示)默认规则也不匹配。
所以为了匹配规则,目标必须是./obj/master.o
所有其他 .o 文件也是如此,您将在子目录中遇到麻烦。为了解决这个问题,您可以直接在配方中创建目标目录:
$(OBJDIR)/%.o: $(SRCDIR)/%.c
mkdir -p $(dir $@)
$(CC) -c -o $@ $(CFLAGS) $<
推荐阅读
- angular - 为什么我得到未捕获的异常:使用 Jasmine 和 Karma 运行 Angular 规范文件时内存不足
- javascript - Mapbox静态图片Url生成的图片与DOM上的canvas不同
- c# - 仅检测 Unity 中的特定键盘组合
- git - 为什么最好使用 rebase 而不是 merge 来解决维护者的冲突?
- java - 从从 kafka 提取的 parquet-avro 消息中检索模式
- r - 在 R data.frame 的每一行中提取不同的 col
- pandas - Pandas groupby 累计总和到阈值
- ruby-on-rails - Rails.cache.delete 不起作用(Dalli 商店)
- javascript - 我将如何使用滑块在散景中绘制特定的 .las 文件 - 并覆盖当前文件
- google-maps - 如何使用 Vue 过滤从 json api 端点提取的 Google Map 上的图钉