.PHONY:clean clean: @echo remove all object files and lib -rm -f *.o *.core $(TARGET) r: make clean make
时间: 2024-02-15 07:48:35 浏览: 26
这是一个 Makefile 文件,主要定义了两个伪目标(.PHONY):clean 和 r。
clean 目标的作用是删除所有的目标文件、core 文件和库文件。
r 目标是一个快捷方式,它先执行 clean 目标,然后再执行 make 命令重新编译程序。
其中,-rm -f 表示强制删除文件,即使文件不存在也不会报错。*.o 表示所有的目标文件,*.core 表示所有的 core 文件,$(TARGET) 表示所有的库文件。
相关问题
请详细并且通俗易懂的解释 makefile中 make clean 命令的东西,比如.PHONY:clean clean: rm -f *.o $(TARGET),为什么要加 .PHONY:clean
"make clean"是一个在Makefile中使用的命令,通常用于删除项目生成的临时文件。
".PHONY: clean"的作用是告诉make这个"clean"不是一个文件名,而是一个伪目标。在这里,".PHONY"指的是非文件目标,也就是说不是一个文件,而是一个任务。
"clean:"命令后面的"rm -f *.o $(TARGET)"表示删除所有后缀名为".o"和$(TARGET)的文件,其中$(TARGET)是一个预定义的变量,代表目标文件的名称。
这么做的目的是为了清理掉项目编译过程中产生的临时文件,使项目重新保持一个干净的状态,方便后续的编译和打包。
检查以下代码是否有误,改正后编译CC := gccCFLAGS := -Wall -Wextra -g -fPICTARGET := calcSRCS := $(wildcard src/*.c)OBJS := $(patsubst %.c, %.o, $(SRCS))LIB_OBJS := $(filter-out src/main.o, $(OBJS))LIB := libuser.so$(LIB): $(LIB_OBJS) $(CC) -shared $^ -o $@$(TARGET): src/main.o $(LIB) $(CC) $< -L. -luser -o $@.PHONY: buildbuild: $(LIB).PHONY: installinstall: $(TARGET) install -m 0755 $(TARGET) /usr/local/bin.PHONY: cleanclean: rm -f src/*.o $(LIB) $(TARGET).PHONY: distcleandistclean: clean rm -rf $(TARGET) /usr/local/bin/$(TARGET)
这个 Makefile 文件看起来没有语法错误,但是需要注意一个问题。在 install 规则中,需要将目标文件的文件名改为 $(TARGET),以避免将目标文件安装到 /usr/local/bin 下一个与目标文件同名的文件。
以下是修改后的 Makefile 文件:
```
CC := gcc
CFLAGS := -Wall -Wextra -g -fPIC
TARGET := calc
SRCS := $(wildcard src/*.c)
OBJS := $(patsubst %.c, %.o, $(SRCS))
LIB_OBJS := $(filter-out src/main.o, $(OBJS))
LIB := libuser.so
$(LIB): $(LIB_OBJS)
$(CC) -shared $^ -o $@
$(TARGET): src/main.o $(LIB)
$(CC) $< -L. -luser -o $@
.PHONY: build
build: $(LIB)
.PHONY: install
install: $(TARGET)
install -m 0755 $(TARGET) /usr/local/bin/$(TARGET)
.PHONY: clean
clean:
rm -f src/*.o $(LIB) $(TARGET)
.PHONY: distclean
distclean: clean
rm -rf $(TARGET) /usr/local/bin/$(TARGET)
```
这个 Makefile 文件定义了 CC 和 CFLAGS 变量的值。规定了目标文件 libuser.so 的依赖文件为 $(LIB_OBJS),以及编译这些文件的规则。同时,规定了目标文件 calc 的依赖文件为 src/main.o 和 $(LIB),以及编译这些文件的规则。增加了 build,install,clean 和 distclean 规则。在 install 规则中,将目标文件的文件名改为 $(TARGET)。