Linux笔记 - - gcc/g++和make/Makefile的使用

1.gcc/g++的概念

gcc/g++是Linux下一款编译器,让代码从一个文本文件(c/cpp)编译为一个可执行程序(.exe)

我们写上一段代码:

//文件名file.cpp
#include
using namespace std;

int main()
{
  cout << "hello Linux" << endl;
  return 0;
}

一个简单的C++打印程序。那怎么让它执行起来呢?

使用g++:

g++ file.cpp

g++ .cpp文件  不带任何选项,默认生成了可执行程序,叫做a.out

gcc只能用来编译C程序,g++可以编译C和C++程序。

 2 gcc/g++选项

了解选项之前,首先要了解文件编译为可执行程序的过程,而gcc/g++的选项则对应者这个过程

2.1 预处理阶段

进行C/C++代码的头文件展开、宏替换、去除注释、条件编译等

选项:g++ -E file.cpp -o file.i

-E表示只进行预处理,-o表示编译的结果写入到file.i当中

Linux笔记 - - gcc/g++和make/Makefile的使用_第1张图片

 

Linux笔记 - - gcc/g++和make/Makefile的使用_第2张图片

写的代码不超过十行,头文件展开后变成一万多行 

 2.2 编译阶段

将生成的目标文件通过语法分析、词法分析、语义分析、符号汇总形成汇编文件(.s)

选项:g++ -S file.i -o file.s

Linux笔记 - - gcc/g++和make/Makefile的使用_第3张图片

 

Linux笔记 - - gcc/g++和make/Makefile的使用_第4张图片

 

2.3 汇编阶段

 将生成的目标文件由汇编代码生成可重定向二进制目标文件(.o),形成符号表

选项:g++ -c file.s -o file.o

Linux笔记 - - gcc/g++和make/Makefile的使用_第5张图片

 

Linux笔记 - - gcc/g++和make/Makefile的使用_第6张图片

 

 2.4 链接阶段

将生成的目标文件链接起来,通过符号表合并生成可执行程序

选项:g++ file.o -o myfile

Linux笔记 - - gcc/g++和make/Makefile的使用_第7张图片

 

Linux笔记 - - gcc/g++和make/Makefile的使用_第8张图片

 

 3.make/Make file的介绍

make是一条命令,Makefile是一个文件,二者搭配使用,完成项目的自动化构建

依赖关系和依赖方法

使用vim打开Makefile文件,写入代码

myfile:file.o
	g++ file.o -o myfile
file.o:file.s
	g++ -c file.s -o file.o
file.s:file.i
	g++ -S file.i -o file.s
file.i:file.cpp
	g++ -E file.cpp -o file.i

myfile是目标文件,依赖与file.o文件,它们构成依赖关系

file.o文件依赖于file.s

file.s文件依赖与file.i

file.i文件依赖与file.cpp

原理

make 是如何工作的 , 在默认的方式下,也就是我们只输入 make 命令。那么,
  • 1. make会在当前目录下找名字叫“Makefifile”“makefifile”的文件。
  • 2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“myfile”这个文件,并把这个文件作为最终的目标文件。
  • 3. 如果myfile文件不存在,或是myfile所依赖的后面的file.o文件的文件修改时间要比myfile这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成myfile这个文件。
  • 4. 如果myfile所依赖的file.o文件不存在,那么make会在当前文件中找目标为file.o文件的依赖性,如果找到则再根据那一个规则生成file.o文件。(这有点像一个堆栈的过程)
  • 5. 当然,你的C文件和H文件是存在的啦,于是make会生成 file.o文件,然后再用 file.o文件声明 make的终极任务,也就是执行文件mytest了。
  • 6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
  • 8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
Linux笔记 - - gcc/g++和make/Makefile的使用_第9张图片

 

项目清理 

工程是需要被清理的
.PHONY:clean
clean:
	rm -f *.o *.s *.i myfile

Linux笔记 - - gcc/g++和make/Makefile的使用_第10张图片

 

  • clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
  • 但是一般我们这种clean的目标文件,我们将它设置为伪目标,.PHONY 修饰,伪目标的特性是,总是被 执行的。

你可能感兴趣的:(Linux,linux,运维,服务器)