make 工具
make是一个很重要的编译工具。主要可以进行编译、链接等工作。
但你是不是想问,我们不是已经有gcc和g++了吗?为什么还需要make工具?
假如有100个源文件先编译再链接,但是之后我又修改了一个源文件,那么是不是我需要把100个源文件重新编译一遍?答案当然是不需要,这就用到了make工具。
当你重新执行make命令时,make工具会比较.c和.o文件修改时间的早晚,从而不需要编译所有的源文件。
make [生成目标的名字]
直接输入make命令,或者指明需要生成目标的名字,就可以使用了。
Makefile变量
| 变量名 | 缺省 | 意义 |
|---|---|---|
| CC | gcc | C编译器名称 |
| CXX | g++ | C++编译器名称 |
| CFLAGS | - | C编译器选项 |
| CXXFLAGS | - | C++编译器选项 |
| CPPFLAGS | - | 编译预处理选项 |
注意CPPFLAGS是编译预处理选项,不要误以为是CXXFLAGS了。
伪目标
| 伪目标 | 作用 |
|---|---|
| all | 指出工程所要编译出的所有实际目标 |
| clean | 把编译所生成的中间文件和结果都删掉(重新执行) |
| install | 把编译成功的的程序放到系统相应目录里(安装) |
| dist | 创建一个压缩文件 |
前三个伪目标相当重要。
在本地编译安装的步骤(下载的源代码)⭐
tar xzf 1.tar.gz。 解压1.tar.gz这个文件。cd 解压后的目录./configure。 bash脚本生成Makeflie文件。make。 进行编译。sudo make install。 需要root权限来进行安装。
书写Makefile⭐
目标:依赖项
(Tab)命令
过程:如果没在make命令中指明,则从第一个目标开始,递归地检查规则。
具体可以看以下例子进行理解。
CFLAGS=-g #c语言编译选项,可修改
LDFLAGS=-L/usr/lib/gsl -lgsl #链接时选项,指明了使用了哪个动态链接库
all:SB #伪目标,指出需要编译出的实际目标
clean: #伪目标,清空所有结果
rm *.o SB
SB:1SB.o 2SB.o 3SB.o 4SB.o 5SB.o … … 100SB.o
#左边必须是Tab键,而不能是空格!!!
gcc –o SB $(LDFLAGS) 1SB.o 2SB.o 3SB.o 4SB.o 5SB.o … … 100SB.o
1SB.o:1SB.c
gcc –c $(CFLAGS) 1SB.c #使用CFLAGS变量的值
...
100SB.o:100SB.c
gcc –c $(CFLAGS) 100SB.c
隐含规则
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c #定义变量
CC = gcc
.c.o: #从.c文件变成.o文件(unix定义方法)
$(COMPILE.c) $(OUTPUT_OPTION) $< #gcc [-各类选项] -c [输出选项] 第一个依赖文件的名称(.c)
make的使用
编译
make hello
make会很智能的给出编译的选项cc hello.c -o hello,并且执行命令生成可执行文件。

调试
CFLAGS=-g make hello
也可以传递变量,生成一些调试信息。

make -p
make -p是用来显示make的各种规则的。

make -f filename
指定用filename文件来寻找规则。
make -n
make -n显示想执行的命令,但并不实际执行。

make使用技巧
函数库源代码放在lib目录中,主程序源代码放在app目录里;在lib目录中,又把所有的.cpp文件放在src目录中,把所有的.h文件放在inc目录中。
- file
- Makefile
- app
- Makefile
- inc
- src
- lib
- Makefile
- inc
- src
cmake
现在的程序员绝大多数都不会直接书写Makefile文件,因为文件之间的依赖关系一般都十分复杂。因此,一般使用cmake来进行组织。
现在有如下结构的项目。

CMakeLists.txt:
project(helloworld)
add_executable(helloworld hello.c)
然后新建一个build目录,用来存放cmake生成的各种文件。
cmake .. #在上级目录寻找CMakeLists.txt

我们会发现在build目录下面生成了Makefile文件,于是我们有就可以使用make工具了。

编译链接执行,最终结果正确。
以上就是cmake的使用方法了。
总结
make工具很强大,内容也很多,光靠几节课充其量只能学个皮毛。如果想要深入了解,还是需要自己课下去阅读大量的书籍。
今天想用make工具的时候有一个小插曲,本想联网安装一个make,结果提示我虚拟机的网络不可用,最后参考了这篇博客才得以解决《Ubuntu突然无法连网的解决方案》。