make 指令中 .PHONY
时间: 2023-10-28 21:05:58 浏览: 40
在Makefile中,.PHONY是一个特殊的目标。它用于标记那些不产生实际文件的目标,而仅仅是执行一些命令或动作的目标。当我们在Makefile中声明了一个目标为.PHONY时,无论是否存在与该目标同名的文件,该目标都会被执行。
.PHONY目标通常用于表示一些常用操作,如clean(清理生成的文件)、all(构建全部目标)等。通过将这些操作声明为.PHONY目标,我们可以确保它们始终会被执行,而不管是否已经存在了同名的文件。
例如,以下是一个简单的Makefile示例,其中声明了clean和all为.PHONY目标:
```
.PHONY: clean all
all: program
program: main.o utils.o
gcc -o program main.o utils.o
main.o: main.c
gcc -c main.c
utils.o: utils.c
gcc -c utils.c
clean:
rm -f program *.o
```
在此示例中,clean和all被声明为.PHONY目标。无论是否存在名为clean或all的文件,当我们运行make clean或make all时,对应的命令都会被执行。
请注意,.PHONY目标是一种约定,它告诉make工具这些目标不是真正的文件依赖关系,而是需要执行的动作。这样做可以避免潜在的问题和冲突。
相关问题
makefile中.PHONY
在 Makefile 中,.PHONY 是一个特殊的目标,它表示一个伪目标,并且不会生成任何文件。.PHONY 目标通常用于定义一些不与文件名对应的操作,例如 clean、all、install 等。这些操作一般是用来清理文件、编译项目、安装程序等,但它们并不对应任何文件,因此需要将它们标记为 .PHONY 目标。
当执行 make 命令时,make 会检查当前目录下的 Makefile 文件,并读取其中的规则和指令。如果 Makefile 中包含了 .PHONY 目标,那么 make 不会去检查是否存在与这些目标同名的文件,而是直接执行相应的指令。这样可以避免由于存在同名文件而产生的错误,同时也提高了 Makefile 的效率。
解析makefile文件:CC = gcc PROG = sensor_server OBJS = sensor_utils.o sensor_protocol.o sensor_platform.o sensor_command.o mq_rabbit.o cJSON.o CLIB = ../common/libcommon.a INCLUDES = -I../common -I/usr/include/ CLINK = -lpthread -lz -liniparser -lrabbitmq -lm CFLAGS = -Wall -O2 all: $(PROG) $(PROG): %: %.c $(OBJS) $(CLIB) $(CC) -o $@ $@.c $(OBJS) $(CLIB) $(INCLUDES) $(CLINK) $(CFLAGS) $(OBJS): %.o : %.c %.h $(CC) -c $< $(INCLUDES) $(CFLAGS) .PHONY : install clean install: #cp -f $(PROG) /usr/local/bin/ clean: rm -f $(PROG) *.o *core
这是一个简单的Makefile文件,用于编译和构建名为 `sensor_server` 的程序。以下是对该Makefile文件的解析:
- `CC = gcc`:定义了变量 `CC`,指定了使用的编译器为 `gcc`。
- `PROG = sensor_server`:定义了变量 `PROG`,指定了生成的可执行文件名为 `sensor_server`。
- `OBJS = sensor_utils.o sensor_protocol.o sensor_platform.o sensor_command.o mq_rabbit.o cJSON.o`:定义了变量 `OBJS`,指定了需要编译的目标文件列表。
- `CLIB = ../common/libcommon.a`:定义了变量 `CLIB`,指定了需要链接的静态库文件路径和名称。
- `INCLUDES = -I../common -I/usr/include/`:定义了变量 `INCLUDES`,指定了头文件搜索路径。
- `CLINK = -lpthread -lz -liniparser -lrabbitmq -lm`:定义了变量 `CLINK`,指定了链接时需要的库文件。
- `CFLAGS = -Wall -O2`:定义了变量 `CFLAGS`,指定了编译选项。
- `all: $(PROG)`:定义了默认目标 `all`,依赖于 `$(PROG)`。
- `$(PROG): %: %.c $(OBJS) $(CLIB)`:定义了生成可执行文件的规则。依赖于 `.c` 文件、目标文件列表和静态库文件。使用 `$@` 表示目标文件名,即 `sensor_server`。使用 `$<` 表示第一个依赖文件,即对应的 `.c` 文件。
- `$(OBJS): %.o : %.c %.h`:定义了生成目标文件的规则。依赖于对应的 `.c` 文件和 `.h` 文件。
- `.PHONY : install clean`:定义了伪目标 `install` 和 `clean`。
- `install:`:伪目标 `install` 的指令部分被注释掉了,即没有实际的操作。
- `clean:`:定义了 `clean` 目标的规则,用于删除可执行文件和目标文件。
通过运行 `make` 命令,根据Makefile文件中的规则,可以编译和构建 `sensor_server` 程序。运行 `make install` 可以执行安装操作(该部分被注释掉了)。运行 `make clean` 可以执行清理操作,删除生成的可执行文件和目标文件。