[英]No rule to make target in GCC Makefile
這是有問題的以下 Makefile:
#
# Compiler flags
#
CC = gcc
CFLAGS = -Wall -Werror -Wextra
#
# Project files
# example -
# SRCS = hash_table.c linked_list.c utils.c common.c business_logic.c user_interface.c
# SRCS = test/gc_test.c src/gc.c
SRCS := $(shell find . -name "*")
OBJS = $(SRCS:.c=.o)
EXE = output.out
FILENAMES := $(shell find . -type f -name "*.c" -printf "%f\n")
FILENAMES_OUT = $(FILENAMES:.c=.o)
#
# Default build settings
#
BUILDDIR = build
BUILDCFLAGS = -g -O0
BUILDEXE = $(BUILDDIR)/$(EXE)
BUILDOBJS = $(addprefix $(BUILDDIR)/, $(FILENAMES_OUT))
# Rules for default build
all: clean build
build: $(BUILDEXE)
$(BUILDEXE): $(BUILDOBJS)
$(CC) $(CFLAGS) $(BUILDCFLAGS) -o $(BUILDEXE) $^ -lcunit
$(BUILDDIR)/%.o: %.c
$(CC) $(CFLAGS) $(BUILDCFLAGS) -c $< -o $@
memtest: $(BUILDEXE)
valgrind --leak-check=full ./$<
#
# Other rules
#
clean:
mkdir -p $(BUILDDIR)
問題-> make: *** No rule to make target `build/gc_test.o', needed by `build/output.out'. Stop.
make: *** No rule to make target `build/gc_test.o', needed by `build/output.out'. Stop.
項目樹
.
├── build
├── doc
│ └── design.md
├── Makefile
├── proj
│ ├── code_quality_report.md
│ ├── deviations.md
│ ├── individual_reflection.md
│ ├── team_reflection.md
│ └── test_report.md
├── README.md
├── src
│ ├── gc.c
│ └── headers
│ └── gc.h
└── tests
└── gc_test.c
問題本身發生在$(BUILDEXE): $(BUILDOBJS)
中,其中依賴項是gc_test.c gc.c
。 這些依賴項應該被捕獲在它下面的 function 中,因為它的輸入是build
目錄中的所有.c 文件。 這些文件應該得到正確匹配,然后編譯為 .o 文件,然后應該爬上樹並生成可執行文件。 我很困惑,因為$(BUILDOBJS)
應該與$(BUILDDIR)/%.o
相同。
我是制作 Makefile 的新手,但我想做得更好。 請指出更好的命名約定或術語可以更好地用於這篇文章。 謝謝!
問題在這里:
FILENAMES := $(shell find . -type f -name "*.c" -printf "%f\n")
這是錯誤的,因為-printf "%f\n"
只打印文件名,沒有任何路徑。 您丟失了有關找到文件的路徑的所有信息,那么如何才能找到它們呢?
您應該將其更改為簡單的-print
然后它將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.