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

1.gcc/g++的概念

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

我们写上一段代码:

//文件名file.cpp
#include<iostream>
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当中

 

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

 2.2 编译阶段

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

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

 

 

2.3 汇编阶段

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

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

 

 

 2.4 链接阶段

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

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

 

 

 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只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

 

项目清理 

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

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

全貌

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值