3.makefile运行流程分析并使用变量改写项目
- GNU make用来构建和管理自己的工程
- Makefile 文件描述了整个工程的编译、连接等规则
3.1makefile变量的使用
命令格式 | 含义 |
---|---|
CXX | C++编译器的名称,默认值为g++ |
CXXFLAGS | C++编译器的选项,无默认值 |
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并出现的先后序,可能包含重复的依赖文件 |
$< | 第一个依赖文件的名称 |
$? | 所有时间戳比目标文件晚的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
版本1:
#first_makefirst_make:first_make.cpp xdata.cppg++ first_make.cpp xdata.cpp - o first_make - lpthread
版本2:
#first_makefirst_make:first_make.cpp xdata.cpp$(CXX) first_make.cpp xdata.cpp - o first_make - lpthread
版本3:
#first_make
# $^ 依赖 不重复
# $@ 目标
first_make:first_make.cpp xdata.cpp$(CXX) $^ -o $@ - lpthread
版本4:
# first_make
# $^ 依赖 不重复
# $@ 目标
TARGET=first_make$(TARGET):first_make.cpp xdata.cpp$(CXX) $^ -o $@ -lpthreadecho "build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# ls
first_make.cpp makefile xdata.cpp xdata.h
root@cmt-virtual-machine:/home/cmt/src/first_make# make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
echo "build success!"
build success!
root@cmt-virtual-machine:/home/cmt/src/first_make#
echo "build success!"
是一个简单的命令,用于在终端上输出文本 "build success!"
。在这个上下文中,它的作用是向用户提示编译过程已经成功完成。具体来说:
- 输出消息:
echo
是一个常见的 shell 命令,用于在终端中输出一段文本。这里的文本是"build success!"
。 - 通知用户:当编译和链接过程完成后,
make
运行了echo
命令,以便在终端中打印一条消息,告诉用户构建过程已经成功结束。
版本5:
# first_make
# $^ 依赖 不重复
# $@ 目标
TARGET=first_make$(TARGET):first_make.cpp xdata.cppecho "begin build $(TARGET)"$(CXX) $^ -o $@ -lpthreadecho "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# ls
first_make.cpp makefile xdata.cpp xdata.h
root@cmt-virtual-machine:/home/cmt/src/first_make# make
echo "begin build first_make"
begin build first_make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
echo "first_make build success!"
first_make build success!
# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行
TARGET=first_make$(TARGET):first_make.cpp xdata.cpp@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ -lpthread@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
begin build first_make
first_make build success!
版本6:执行一段代码有可能失败
# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行
TARGET=first_make$(TARGET):first_make.cpp xdata.cpprm test@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ -lpthread@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
rm test
rm: 无法删除 'test': 没有那个文件或目录
make: *** [makefile:8:first_make] 错误 1
root@cmt-virtual-machine:/home/cmt/src/first_make#
失败后后面的代码不执行。
我们希望失败后,继续执行后面的代码
# first_make
# $^ 依赖 不重复
# $@ 目标
# @ 不显示命令执行 -失败不停止
TARGET=first_make
LIBS=-lpthread
$(TARGET):first_make.cpp xdata.cpp@#-rm test@echo "begin build $(TARGET)"@$(CXX) $^ -o $@ $(LIBS)@echo "$(TARGET) build success!"
root@cmt-virtual-machine:/home/cmt/src/first_make# make
begin build first_make
first_make build success!
参考资料来源:夏曹俊