簡體   English   中英

MakeFile 的子目錄和 GCC 問題

[英]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/%.omaster.o不匹配

如果master.csrc中(如注釋所示),則默認規則也不匹配。

所以為了匹配規則,目標必須是./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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM