没有制定目标的规则 - 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 规则是目标只是 %
的规则。该规则可以(顾名思义)匹配任何目标。它可以匹配 foo
、foo.o
、foo.c
、foo.h
或 makefile 中的任何其他内容。
这使得这些类型的规则非常低效,因为 make 必须考虑这个规则,以及每个目标的先决条件等。这样也容易陷入循环
因此,make 在 match-anything 规则上安装了一大堆其他模式规则不存在的额外限制。您可以 read all about this 在 GNU 中进行手动讨论,但最好 take-away 是“不要使用它们”。
我建议您将其替换为 static pattern rule:
$(EXECUTABLE) : %: %00.o
$(CC) -o $@ $+
这是我的 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 规则是目标只是 %
的规则。该规则可以(顾名思义)匹配任何目标。它可以匹配 foo
、foo.o
、foo.c
、foo.h
或 makefile 中的任何其他内容。
这使得这些类型的规则非常低效,因为 make 必须考虑这个规则,以及每个目标的先决条件等。这样也容易陷入循环
因此,make 在 match-anything 规则上安装了一大堆其他模式规则不存在的额外限制。您可以 read all about this 在 GNU 中进行手动讨论,但最好 take-away 是“不要使用它们”。
我建议您将其替换为 static pattern rule:
$(EXECUTABLE) : %: %00.o
$(CC) -o $@ $+