[英]Subdirectories and GCC problem with MakeFile
我正在為一個用makefile
編寫的非常小的個人項目編寫 makefile。
我的項目分為子目錄,但是即使(我認為)代碼是正確的,也找不到這些 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.c
創建master.o
的規則。
在以下規則中:
$(OBJDIR)/%.o: $(SRCDIR)/%.c
./obj/%.o
與master.o
不匹配
如果master.c
在src
中(如注釋所示),則默認規則也不匹配。
所以為了匹配規則,目標必須是./obj/master.o
所有 other.o 文件也是如此,您將在子目錄中遇到麻煩。 為了解決這個問題,您可以直接在配方中創建目標目錄:
$(OBJDIR)/%.o: $(SRCDIR)/%.c
mkdir -p $(dir $@)
$(CC) -c -o $@ $(CFLAGS) $<
gcc 的默認行為是將 .o 文件放在 .c 文件下方。 要將其放入 object 文件目錄中,您必須使用-o $@
參數:
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(ENV) $(CC) $(CFLAGS) -c $< -o $@
並且構建規則應該取決於$(addprefix $(OBJDIR)/, $(SRCS))
如果這是命令中使用的內容。
build: prepare $(addprefix $(OBJDIR)/, $(SRCS))
$(ENV) $(CC) $(addprefix $(OBJDIR)/, $(SRCS)) -o $(BINDIR)/$(TARGET)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.