没有合适的资源?快使用搜索试试~ 我知道了~
linux 下Makefile 编写规则
需积分: 0 7 下载量 190 浏览量
2023-03-14
10:26:59
上传
评论
收藏 34KB DOCX 举报
温馨提示
试读
17页
linux 下Makefile 编写规则
资源推荐
资源详情
资源评论
Makefile 规则
很多项目中我们会使用 make 命令进行项目的编译。这个 make 命令的背后就是按照了 Makefile 文件
定义的格式去完成项目编译。
因此 Makefile 的作用就是帮助程序员进行项目的构建,它按照项目的需求个性化的定义自己的构建过
程。Makefile 并不限定编程语言,但是在 c/c++项目中使用相对较多。其他的一些构建工具,例如
qmake,也是将*.pro 文件转化为 Makefile,再进行构建。
可以看出 Makefile 的应用面还是非常广泛的, 下面将一步一步的讲解 Makefile 最常使用的语法, 并
通过案例进行实践, 一步一步深入 Makefile, 本文的案例主要使用了 C++语言。
makefile 的基本规则
Makefile 的格式通常有如下两种:
格式一:
targets : prerequisites
command
...
格式二:
targets : prerequisites ; command
command
...
其中,targets 为目标文件, prerequisites 为依赖文件, command 为如果使用依赖文件构建出目标文
件的命令。
格式一中,command 不与"target:prerequisites"在一行,必须以 Tab 键开头。
格式二中, command 和 prerequisites 在一行,那么可以用分号做为分隔。
通常情况下, 一般使用格式一, 命令和依赖分开, 比较清晰。
构建的逻辑如下所示:
(1)如果发现目标文件不存在,但是依赖文件存在,就会执行命令集构建生成目标文件。
(2)如果发现目标文件不存在,但是依赖文件也不存在,那么就会寻找依赖文件的构建模块, 尝试构
建依赖文件, 然后再构建目标文件。
(3)如果发现目标文件已经存在,依赖文件也存在,make 指令会自动去比较两者的修改时间:
� 依赖文件的最后修改时间晚于目标文件,就会执行指令集合。
� 依赖文件的最后修改时间早于目标文件,就不会执行指令集合。同时会提示目标文件已经是最新的。
(4)如果发现目标文件已经存在, 依赖文件不存在,那么 makefile 将会寻找依赖文件的构建模块,并
尝试构建依赖模块, 由于依赖模块生成时间晚于目标文件, 因此目标文件将会重新构建。
下面我们用过一些 demo,一步一步的深入 Makefile。
下面是 demo1, 通过 demo1 来熟悉 makefile 的基本语法。
demo1:第一个 Makefile
demo1 的目录结构如下所示:
.
├── main.cpp
└── Makefile
其中 main.cpp 如下:
#include <iostream>using namespace std;int main () {
cout << "Hello World" << endl;
}
为其编写的 Makefile 如下:
main:main.o
g++ main.o -o mainmain.o:main.cpp
g++ -c main.cpp main.o.PHONY : cleanclean:
rm -rf *.o main
首先看构建 main 对象,main 对象依赖于 main.o 对象 main:main.o, 因此需要完成 main.o 对象的构
建。
接着看到 main.o 对象依赖于 main.cpp 文件, 该文件存在与当前目录中, 因此执行相应的命令 g++
-c main.cpp。
main.o:main.cpp
g++ -c main.cpp
如此之后, main.o 对象构建成功,这样就可以构建 main 对象,于是执行了 main 对象的命令 g++
main.o -o main。
至此 main 对象的构建完毕。
makefile 的最后一部分是一个 clean 对象, 用于清理生成的文件, 使用 make clean 即可构建 clean
对象。 关于关键字.PHONY 将在下面的例子中讲解。
.PHONY : cleanclean:
rm -rf *.o main 使用$@
使用$@ $< $^符号简化编写
在 Makefile 中,可以使用一些预定好的符号来简化书写, 例如$@ $< $^,其含义如下所示:
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
例如: main: main.cpp add.cpp
$@指的就是 main,$<指的就是 main.cpp, $^指的就是 main.cpp add.cpp
下面我们就使用它们来改动 demo1 中的 makefile。
demo2:使用$@ $< $^ 简化书写
demo2 的文件结构如下所示:
.
├── main.cpp
└── Makefile
main.cpp 如下:
#include <iostream>using namespace std;int main () {
cout << "Hello World" << endl;
}
Makefile 内容如下:
剩余16页未读,继续阅读
资源评论
hpunix
- 粉丝: 1
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功