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

简介: 【Linux】Linux编译器-gcc/g++使用

当你的希望一个个落空,你也要坚定,要沉着!                                          —— 朗费罗

debacd671389c6b8df4d24e54fe635bf_72df34436a3746fabaca4cf7cc18c699.gif

前言

gcc/g++是一个编译器

那么gcc将如何实现呢?

格式   gcc [选项] 要编译的文件 [选项] [目标文件]

📘程序的翻译

程序编译分为四个过程:


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


预处理(头文件展开,条件编译,宏替换,去注释等)

编译(c语言汇编语言)

汇编(汇编->可重定位目标二进制文件,不可以被执行的,bin.obj)只把我们自己的代码进行翻译形成二进制目标文件

链接(将我们这自己形成的.obj文件和库文件某种合并,形成可执行程序)

🖍编译过程

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

预处理指令是以#号开头的代码行。

实例: gcc –E hello.c –o hello.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。  

下面我来详细演示具体实现:

这是myfile.c文件中写的C语言程序

 

如何直接生成可执行程序呢?

gcc 文件名 可以将文件直接编译成一个a.out的可执行程序

当需要生成一个需要由指定文件名的可执行程序如何操作呢?

-o为目标文件

具体过程:

8501c0028d4865a960bd457efb71a8cd_30a13de677bc42859959ea8c1eb478e3.png

“.i”文件为已经过预处理的C原始程序


“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。


“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。


汇编阶段是把编译阶段生成的“.s”文件转成目标文件“.o”的二进制目标代码


在成功编译之后,就进入了链接阶段。

0dc6bb19913aab77ea76860308b36629_d7c9cd83f1124a2789f43f82d09d1398.png


44dabfba4a250cfe7271151ef5158b69_12bbd2994dd24896a0efc9fb4a92b173.png


📘动态库和静态库

1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器, 对用户的程序进行动态链接的)

2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中

3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位

4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行

5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行!

6.静态库,因为自身拷贝的问题,比较浪费空间

7.动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间

8.静态库vs动态库: Linux默认使用的是动态链接和动态库!


1.静态库: libXXXXXX.a

2.动态库: libXXXXXX.so

静态链接

综上总结:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接

Linux项目自动化构建工具-make/Makefile

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

依赖关系

上面的文件 myfile ,它依赖 myfile.o

myfile.o , 它依赖 myfile.s

myfile.s , 它依赖 myfile.i

myfile.i , 它依赖 myfile.c

依赖方法

上面文件的指令就是依赖方法

clean:换行后删除语句

但是一般我们这种clean的目标文件,我们将它设置为伪目标

用 .PHONY 修饰,伪目标的特性是,总是被执行的。

使用make不成功的常见原因及解决方法

当你文件已经是最新版本时,系统就认为你不需要在进行make操作就会报这样的报错

我们可以通过时间来判断文件是否是最新的!

stat 文件名 可以查看时间

touch可以更改为最新时间

相关文章
|
5月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
7月前
|
Linux C语言
成功解决 在Linux CentOS 7 中安装gcc
这篇文章介绍了如何在Linux CentOS 7系统中安装gcc (g++) 8工具集。由于CentOS 7默认的gcc版本是4.8,而这个版本与Qt 5.14、Qt 5.15或更高版本不兼容,可能会导致编译时出现系统头文件错误。文章中提到,即使在项目配置中添加了`CONFIG+=c++11`,如果仍然报错,那么很可能是gcc版本的问题。为了解决这个问题,文章提供了使用CentOS的Software Collections (scl)来安装更新版本的gcc的步骤。
成功解决 在Linux CentOS 7 中安装gcc
|
6月前
|
Linux 编译器 C语言
Linux内核对GCC版本的检测
Linux内核对GCC版本的检测
|
7月前
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
160 0
|
9月前
|
Java 编译器 Linux
程序技术好文:详解Linux安装GCC方法
程序技术好文:详解Linux安装GCC方法
277 0
|
9月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
145 0
|
21天前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
56 23
Linux系统之whereis命令的基本使用
|
4月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
395 8
|
7天前
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
63 25
|
6天前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
15 2