【linux基础(六)】Linux中的开发工具(中)--gcc/g++

简介: 【linux基础(六)】Linux中的开发工具(中)--gcc/g++

1. 前言

如果你不知道vim的各种用法和快捷键

请先阅读上一篇文章: yum和vim详解

现在,我们可以在Linux下编辑代码了

编辑好的文件是一个.c文件,vim不像

VS一样既可以编写代码也可以运行代码

在Linux中运行代码需要使用:gcc,g++

本章重点:

本篇文章会着重讲解gcc/g++的使用
以及程序翻译的几个过程和对应的文件
最后讲解动态库和静态库的区别和联系


2. gcc/g++的使用介绍

首先我们要明确一点:

在之前的Linux学习中谈到

Linux中不分文件后缀,所以文本文件可以

设置后缀为txt来提醒读者这是一个文本文件

也可以什么都不写

但是Linux系统不分文件后缀
不代表Linux下的各种程序不分!

今天要学习的gcc和g++就是Linux下的程序

它们是要看文件后缀的!

  • gcc: C语言编译器,只能编译C语言
  • g++: C++编译器,C/C++都可以编译

gcc/g++使用方法:

  1. 生产的可执行程序名字默认为:a.out
gcc code.c
  1. 自定义可执行程序的名字
gcc code.c -o 自定义名字
  1. 使用C99标准来编译
gcc code.c -std=99

3. 执行可执行程序

执行可执行程序:

当我们编译好程序后,会在当前目录生成一个
可执行程序,此文件通常是绿色的

此时我们只需要使用以下指令即可运行代码!

./a.out

注:.代表要在当前目录下找可执行文件.必须加上


4. 程序翻译的四个阶段

虽然现在已经掌握了如何编译并运行代码

但是在C/C++代码的翻译过程中还有四个

阶段值得我们去学习:

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

4.1 预处理阶段

预处理阶段要做的工作有:

  • 头文件展开
  • 去掉注释
  • 条件编译
  • 宏替换

那么预处理阶段过后还是C语言吗?

现在我们用Linux指令来查看一下:

使用指令: gcc -E csdn.c -o csdn.i

指令解释:将程序停留在预处理过程后,生成.i文件

现在我们使用vim编辑器打开.i件:

预处理阶段

可以发现,我们写的代码在最下面
然而上面还有几百行其实就是头文件展开
所谓头文件展开就是:
将头文件的内容拷贝到当前文件
在头文件中有许多空行,这是
因为原先的头文件有注释,此时注释已经没了

注:其他工作大家可自行去验证


4.2 编译阶段

编译阶段的主要工作是:

  • 将C语言翻译为汇编代码

编译阶段过后,就不是C语言了!

现在我们用Linux指令来查看一下:

使用指令: gcc -S csdn.i -o csdn.s

指令解释:将程序停留在编译过程后,生成.s文件

注:可以由.c文件直接使用以上指令变成.s文件

使用vim编辑器打开.s文件:

B站视频描述

可以发现,现在的汇编代码

如果没有了解过是很难读懂的


4.3 汇编阶段

汇编阶段的主要工作是:

  • 将汇编代码变成可重定位二进制文件

汇编阶段过后,文件存放的是二进制信息!

现在我们用Linux指令来查看一下:

使用指令: gcc -c csdn.s -o csdn.o

指令解释: 将程序停留在汇编过程后,形成.o文件

注:这里也可以用.c或.i文件形成.o文件

此时使用vim打开文件是乱码
可以使用指令od查看二进制文件:

B站视频描述


4.4 链接阶段

链接阶段比较复杂,它大致的流程是这样的:

.o文件 + 系统库 = 可执行程序

在本篇文章的后半段讲完动静态库后再解释!


5. 库函数的命名和分类(动静态库)

我们在写C语言代码时使用的printf函数

并没有自己实现,然而在stdio.h头文件中

也只有printf函数的说明,那么此函数的

实现是在哪里实现的呢?

引出今天的新内容

查看一个可执行程序依赖的第三方库

使用指令: ldd 可执行程序名

可以发现,在路径lib64里有一个文件叫libc.so.6

这个就是刚刚的C语言程序所要依赖的库

对于库名字的解释:

可见,libc.so.6实际上就是C的标准库!

拓展:Linux和Windows下动静态库命名区别:

  • Linux下: .so 是动态库 .a 是静态库

  • Windows下: .ddl 是动态库 .lib 是静态库

现在我们就可以理解链接过程了
链接过程就是将.o文件和动/静态库结合的过程


6. 动静态库的区别与优缺点

通俗的来讲,动态库类似于网吧的电脑

而静态库类似于自己家里的电脑

它们的区别是:

  • 动态库是共享库,通过函数地址来关联程序
  • 静态库是私有库,可以独立运行

动态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来

静态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!

说白了,静态库是将所有代码拷贝过来

而动态库是去找函数的地址调用此函数

动静态库的优缺点:

  • 动态库: 优点:形成的可执行程序体积较小,节省资源
    缺点:要找函数地址,会稍慢一点,并且有强依赖性

  • 静态库: 优点:无视库,可以独立运行
    缺点: 体积太大,浪费资源

我们在编译代码时,默认使用的是动态库

并且Linux下绝大多数库都是动态库!

如果你想使用静态库编译代码

使用指令: gcc code.c -static


7.总结以及拓展

总的来说gcc,g++这两个编译器并不难

掌握它们就需要学会使用一些特殊的指令

这里列出一些gcc常用的指令
大家可以下来自己尝试:

拓展: 计算机语言发展史和C/C++的翻译过程

众所周知,计算机只认识二进制码是因为

计算机内的硬件元器件只认识二进制(正电/负电)

最开始和计算机交流是用二进制进行交流

最经典的用具就是二进制打孔胶带

科学家觉得用二进制交流非常不方便!
于是发明了汇编语言,汇编语言和汇编编译器
都是用二进制码写的,当这一过程被完善后
就可以用汇编语言来重新编写汇编编译器了!

有了汇编语言后陆陆续续又发展了许多语言
最经典的莫过于C语言!然而C语言是用汇编
代码编写的,C语言的编译器也是用汇编代码写的
当这一过程成熟后,就可以用C语言程序编写
C语言的编译器了,于是语言才慢慢发展起来

结论:

通过了解C语言的历史我们发现
C语言的翻译过程正是它的历史过程!
先从C语言翻译为汇编,再从汇编翻译为二进制
因为大佬总是懂得站在巨人的肩上,有前人
编写了从汇编到二进制的代码,那么我们就
不用再写直接从C语言到二进制的代码了

一是方便了科学家本身,二是让我们勿忘历史!


🔎 下期预告:Linux开发工具(下) 🔍


相关文章
|
10月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
506 0
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
441 2
|
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
|
Linux 编译器 C语言
Linux内核对GCC版本的检测
Linux内核对GCC版本的检测
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
407 0
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
Java 编译器 Linux
程序技术好文:详解Linux安装GCC方法
程序技术好文:详解Linux安装GCC方法
741 0
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
171 0
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1474 0
|
7月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
828 1
二、Linux文本处理与文件操作核心命令