[Linux从无到有]gcc/g++与make/makefile

Posted 一个正直的男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux从无到有]gcc/g++与make/makefile相关的知识,希望对你有一定的参考价值。

一个程序是如何跑起来的

难道不是Ctrl+f5吗,确实但是在这个过程在还进行了以下操作

  1. 预编译
  2. 编译
  3. 汇编
  4. 链接

可我在vs或clon或别的编译器中没有这样呀,没错但是linux下可以那么我将告诉你是哪些命令


预编译

在这个间断中会进行如下操作

  1. 删除注释
  2. 包头文件
  3. 宏替换
  4. 条件编译

在linux中需要这条指令 :gcc -E test.c -o test.i

-E 他的作用就是激活预处理,但是不剩成文件,所以 -o test,i 就是我指定生产的文件

-o 的作用的输出到文件中


编译

在这个间断中会进行如下操作

  1. 将c代码转换成汇编代码
  2. 语法分析
  3. 语义分析
  4. 词法分析
  5. 符号汇总

在linux中需要这条指令 :gcc -S test.c -o test.s


汇编

在这个间断中会进行如下操作

  1. 将汇编代码转换成二进制代码
  2. 生产符号表

在linux中需要这条指令 :gcc -c test.c -o test.o

链接

在这个间断中会进行如下操作

  1. 合并符号表

  2. 合并段表

在linux中需要这条指令 :gcc test.c


函数库

上述中链接的时候会链接库,且链接库有以下情况?

  1. 动态链接库
  2. 静态链接库

  • 那么为啥要链接库呢?

好问题,那么你平时用的printf这种函数是那里来的呢? 且上述中在stdio这个头文件其实都是声明,那么他定义呢?其实库就是存放他们的定义

那么到底是哪种呢?在linux中只需要一下命令即可

ldd [可执行文件]
fail [可执行文件]

一般文件后缀为.so的就是动态库,可是他要依赖于他人的那咋办我想子给自足呀,那么只需要在连接的时候加一个选项 - static那么就会去链接静态库

动态链接与静态链接的区别

动态库本质就是需求就去链一下

但是静态就是我直接拷贝


makefile与make

在c++中编译要用gcc来编译对应的文件生成一个可执行,每次编译都要输可以不可以向vs一样之间运行就跑起来呢?答案是可以虽然差一点意思

  1. 创建一个文件makefile
  2. 写依赖关系与依赖方法
  3. make

如图:

注意一个就是在写依赖方法的时候必须要tab顶格

既然可以一键化生成,那么可以一键化删除吗?答案是当然可以

  1. 指令 .PHONY+指令
  2. 写依赖关系与依赖方法
  3. make 指令


如果没有写那么他的依赖关系就是空,且 .PHONY所修饰的指令是一直可执行的这个是啥意思呢如图:

效率提升

这里有俩个符号可以让你提升效率

$^就是代表依赖的文件 $ @就是生成可执行,你想就这样吗我手动敲不也差不多吗emmm,年轻人路走窄了呀,你想以后假设你要调不同的接口又在不同的文件里面你说那时候你写依赖发发跨拉垮拉一大堆我$^就解决了是不是

以上是关于[Linux从无到有]gcc/g++与make/makefile的主要内容,如果未能解决你的问题,请参考以下文章

Linux超好用的编译工具 —— gcc/g++

《Linux从0到99》四 Linux编译器(gcc/g++)和调试器(gdb)

《Linux从0到99》四 Linux编译器(gcc/g++)和调试器(gdb)

Linux编译器-gcc/g++使用

Linux环境下GNU, GCC, G++编译器(转)

喵呜:Linux环境基础开发工具使用篇之Linux开发工具:Linux编译器-gcc/g++使用