3.makefile运行流程分析并使用变量改写项目
3.makefile运行流程分析并使用变量改写项目
- GNU make用来构建和管理自己的工程
- Makefile 文件描述了整个工程的编译、连接等规则
3.1makefile变量的使用
命令格式 | 含义 |
---|---|
CXX | C++编译器的名称,默认值为g++ |
CXXFLAGS | C++编译器的选项,无默认值 |
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并出现的先后序,可能包含重复的依赖文件 |
$< | 第一个依赖文件的名称 |
$? | 所有时间戳比目标文件晚的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
版本1:
#first_make
first_make:first_make.cpp xdata.cpp
g++ first_make.cpp xdata.cpp - o first_make - lpthread
版本2:
#first_make
first_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 $@ -lpthread
echo "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.cpp
echo "begin build $(TARGET)"
$(CXX) $^ -o $@ -lpthread
echo "$(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.cpp
rm 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!
参考资料来源:夏曹俊
分类:
makefile学习
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
2023-08-10 7.静态库和共享(动态)库