linux学习笔记[华电](4)——make工具

make 工具

make是一个很重要的编译工具。主要可以进行编译、链接等工作。
但你是不是想问,我们不是已经有gcc和g++了吗?为什么还需要make工具?

假如有100个源文件先编译再链接,但是之后我又修改了一个源文件,那么是不是我需要把100个源文件重新编译一遍?答案当然是不需要,这就用到了make工具。
当你重新执行make命令时,make工具会比较.c和.o文件修改时间的早晚,从而不需要编译所有的源文件。


make [生成目标的名字]

直接输入make命令,或者指明需要生成目标的名字,就可以使用了。

Makefile变量

变量名缺省意义
CCgccC编译器名称
CXXg++C++编译器名称
CFLAGS-C编译器选项
CXXFLAGS-C++编译器选项
CPPFLAGS-编译预处理选项

注意CPPFLAGS是编译预处理选项,不要误以为是CXXFLAGS了。

伪目标

伪目标作用
all指出工程所要编译出的所有实际目标
clean把编译所生成的中间文件和结果都删掉(重新执行)
install把编译成功的的程序放到系统相应目录里(安装)
dist创建一个压缩文件

前三个伪目标相当重要。

在本地编译安装的步骤(下载的源代码)⭐

  1. tar xzf 1.tar.gz。 解压 1.tar.gz 这个文件。
  2. cd 解压后的目录
  3. ./configure。 bash脚本生成Makeflie文件。
  4. make。 进行编译。
  5. 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突然无法连网的解决方案》


版权声明:本文为weixin_41650348原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。