【Linux】 开始使用 gcc 吧!!!

简介: 我们在windows环境和macos环境里都有功能强大的集成开发环境(IDE)供我们使用,但是在Linux中我们如何编译运行我们的代码呢?这里就需要使用gcc / g++ 了。

1 认识gcc

我们在windows环境和macos环境里都有功能强大的集成开发环境(IDE)供我们使用

,但是在Linux中我们如何编译运行我们的代码呢?这里就需要使用gcc / g++ 了。

2 背景知识

在学习使用gcc之前,我们需要了解代码的编译过程(可以看文章: 编译与链接):

  1. 预处理 (进行宏替换,去注释,头文件展开等)
  2. 编译(将 C语言 转换为 汇编语言 )
  3. 汇编(将 汇编语言 转换 二进制目标文件)
  4. 链接 (形成可执行程序)

3 gcc 怎样完成 ?

了解了上述背景知识,我们需要通过gcc来帮助我们实现这四个步骤,让代码可以成功运行。

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

这一步指令就可以帮助我们得到可执行程序。效果如下:

我们接下来再来看具体每一步的操作如何实现

3.1 预处理

预处理

预处理指令:

gcc -E 要预处理的文件 [选项] [目标文件]

一般我们得到的预处理文件使用.i后缀

我们可以验证一下预处理是不是完成去注释等操作:

可以看到经过预处理之后,我们的代码变成了近千行,这就是对头文件进行的引用展开(去注释后),展开宏定义的效果。

^条件编译

先引入一个问题,一个产品的不同版本(个人版 社区版 专业版)需要维护几个文件???

答案是: 一个

条件编译就是实现这个的重要方法;

通过条件编译我们就实现了对于一个代码的不同版本实现!!!

3.2 编译

编译指令:

gcc -S 要编译的文件 [选项] [目标文件]

一般我们得到的编译文件使用.s后缀

我们来看看是不是可以成功转换为汇编语言:

可以看到刚才的近千行代码成为了使用汇编语言的文件。

3.3 汇编

汇编指令:

gcc -c 要汇编的文件 [选项] [目标文件]

一般我们得到的二进制文件使用.o后缀

我们来看看是不是可以成功转换成二进制文件:

现在使用 vim 打开后是乱码,大致可以理解是已经转换成二进制了。

3.4 链接

链接指令:

gcc 要链接的文件 [选项] [目标文件]

一般我们得到的可执行文件使用.exe后缀

我们来执行这一步看看效果:

成功执行!!!

4 函数库

我们的代码中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢???

答案是:

系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用

这里的库又分为动态库 和 静态库

  1. 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  2. 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。

gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

我们看看使用动态库和静态库的区别:

使用静态库的可执行文件比使用动态库的文件大了近100倍

这就是因为静态库把库加到了可执行文件里。让文件的可移植性大大加强!当然所占内存也打了不少。

5 gcc 基本选项

  1. E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  2. -S 编译到汇编语言不进行汇编和链接
  3. -c 编译到目标代码
  4. -o 文件输出到 文件
  5. -static 此选项对生成的文件采用静态链接
  6. -g 生成调试信息。GNU 调试器可利用该信息。
  7. -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  8. -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  9. -w 不生成任何警告信息。
  10. -Wall 生成所有警告信息
    具体效果请大家多多尝试!

Thanks♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

相关文章
|
7月前
|
Linux 开发工具 C语言
Linux 安装 gcc 编译运行 C程序
Linux 安装 gcc 编译运行 C程序
113 0
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
7月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
4月前
|
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
|
3月前
|
Linux 编译器 C语言
Linux内核对GCC版本的检测
Linux内核对GCC版本的检测
|
4月前
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
111 0
|
6月前
|
Shell Linux 网络安全
Linux怎样在使用ssh 链接时就指定gcc 的版本
Linux怎样在使用ssh 链接时就指定gcc 的版本
63 7
|
6月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
356 2
|
6月前
|
Ubuntu Linux 编译器
当自身需要使用的 gcc版本 和Linux 默认版本 存在大版本差异时怎样处理
当自身需要使用的 gcc版本 和Linux 默认版本 存在大版本差异时怎样处理
147 2
|
6月前
|
Java 编译器 Linux
程序技术好文:详解Linux安装GCC方法
程序技术好文:详解Linux安装GCC方法
197 0