没有制定目标的规则 - makefile

No rule to make target - makefile

这是我的 makefile:

CC=gcc
CFLAGS=-c -O2 -Wall -fcommon -I./INC

#umiestnenie zdrojakov kniznice
SRC_LIB_DIR=SRC_LIB

#automateicke generovanie zdrojakov kniznice
SRC_LIB := $(wildcard $(SRC_LIB_DIR)/*.c)
OBJ_LIB=$(SRC_LIB:.c=.o)

#meno vykonatelneho programu
EXECUTABLE=test_rx test_tx
#vymenovanie zdrojakov aplikacie
SRC_EXE=demo_rx.c demo_tx.c
OBJ_EXE=$(SRC_EXE:.c=.o)

all: $(SRC_EXE) $(SRC_LIB) $(EXECUTABLE)

%: %00.o 
    $(CC) -o $@ $+ 

.c.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f $(EXECUTABLE).exe *.o *.a SRC_LIB/*.o

文件夹如下所示:

example_RS232
      |__INC (rs232.h, example_modified_rs232.h)
      |__SRC_LIB (rs232.c, example_modified_rs232.c)
      |__demo_rx.c
      |__demo_tx.c
      |__makefile

在 Windows.I 上用 Mingw 的 C 语言编译正在尝试将 demo_rx.c 和 demo_tx.c 文件编译成 test_rx 和 test_tx 可执行文件。编译时出现错误:

make: *** No rule to make target 'test_tx', needed by 'all'.  Stop.

我不知道为什么会出现这个错误。

基本上,您应该尽量不要使用“match-anything”规则。 match-anything 规则是目标只是 % 的规则。该规则可以(顾名思义)匹配任何目标。它可以匹配 foofoo.ofoo.cfoo.h 或 makefile 中的任何其他内容。

这使得这些类型的规则非常低效,因为 make 必须考虑这个规则,以及每个目标的先决条件等。这样也容易陷入循环

因此,make 在 match-anything 规则上安装了一大堆其他模式规则不存在的额外限制。您可以 read all about this 在 GNU 中进行手动讨论,但最好 take-away 是“不要使用它们”。

我建议您将其替换为 static pattern rule:

$(EXECUTABLE) : %: %00.o 
        $(CC) -o $@ $+