gcc/g++超详细上手教程(代码片段)

iwannabewater iwannabewater     2022-12-09     410

关键词:

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

写在开篇:详细介绍一哈 Linux下gcc/g++ 的使用,收藏起来呀~~

正文开始@Assassin

1. 背景知识:

  • 预处理(进行宏替换)
  • 编译(生成汇编)
  • 汇编(生成机器可识别代码)
  • 连接(生成可执行文件或库文件)

2. gcc如何完成:

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

3. 编译过程:

  • 预处理: 头文件展开,宏替换,注释去掉
    gcc -E hello.c -o hello.i
  • 编译: C文件变成汇编文件
    gcc -S hello.i -o hello.s
  • 汇编: 把汇编文件变成二进制文件
    gcc -c hello.s -o hello.o
  • 链接: 把函数库中的相应代码组合到目标文件中
    gcc hello.o -o hello

注: 对应CPP编译的话就把gcc换成g++就行了~~

4. 预处理(进行宏替换):

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例: gcc –E hello.c –o hello.i
  • 选项"-E",该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项"-o"是指目标文件,".i"文件为已经过预处理的C原始程序。

5. 编译(生成汇编):

  • 在这个阶段中,gcc 首先要检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用"-S"选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • 实例: gcc –S hello.i –o hello.s

6. 汇编(生成机器可识别代码):

  • 汇编阶段是把编译阶段生成的".s"文件转成目标文件
  • 大伙在此可使用选项“-c”就可看到汇编代码已转化为".o"的二进制目标代码了
  • 实例: gcc –c hello.s –o hello.o

7. 连接(生成可执行文件或库文件):

  • 在成功编译之后,就进入了链接阶段。
  • 实例: gcc hello.o –o hello

8. 这里涉及到一个重要的概念—>函数库:

  • 我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实"printf"函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数"printf"了,而这也就是链接的作用。

8.1 函数库一般分为静态库和动态库两种:

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为".a"。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为".so",如前面所述的 libc.so.6 就是动态库。
    gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示:gcc hello.o –o hello。
  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

9. gcc/g++选项:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。
  • -S 编译到汇编语言不进行汇编和链接。
  • -c 编译到目标代码。
  • -o 文件输出到文件。
  • -static 此选项对生成的文件采用静态链接。
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。
  • -w 不生成任何警告信息。
  • -W 只生成编译器认为会报错的信息。
  • -Wall 生成所有警告信息。
  • -I + 路径 提供编译时所需头文件路径。

10. gcc/g++选项记忆:

我的记忆技巧是:编译带选项时,你可以联想到键盘上的ESC键,就是左上角的退出键,-E,-S,-c,是不是很有灵性[doge],然后依次生成的文件可以联想到你下载linux系统提供的 .iso 镜像文件,hhh,依次为 .i-----.s-----.o 。这下估计你一时半会儿忘不掉了hh----

写在结尾:

有问题请issue我~~,谢谢大嘎^_^

see you next blog~~

vue-cli(vue脚手架)超详细教程(代码片段)

 都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到陌生,重要的是思路的变换,以前用jq随便拿全局变量和修改dom的锤子不能用了,vue只用关心数据本身,不用再频繁繁琐的... 查看详情

转帖超详细的vagrant上手指南(代码片段)

本文转自https://zhuanlan.zhihu.com/p/259833884超详细的Vagrant上手指南DavyCloud努力把事讲清楚91人赞同了该文章搭建Linux虚拟机,别再用VirtualBox从.iso文件安装了。概述2020年了,也许你已经习惯了docker,习惯了在XX云上快速创建... 查看详情

b站视频教程笔记基于vscode和cmake实现c/c++开发|linux篇(gcc/g++)(安装配置使用详细教程)(vscode教程)(cmake教程)(精!)(代码片段)

基于VSCode和CMake实现C/C++开发|Linux篇文章目录目录结构文件编辑vim(编辑器之神,linux里可以畅通无阻,必学,但不是现在!)安装GCC和GDBg++编译过程动手操作g++编译参数编译带调试信息的... 查看详情

vue2全家桶之一:vue-cli(vue脚手架)超详细教程(代码片段)

  都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到陌生,重要的是思路的变换,以前用jq随便拿全局变量和修改dom的锤子不能用了,vue只用关心数据本身,不用再频繁繁... 查看详情

vue2全家桶之一:vue-cli(vue脚手架)超详细教程(代码片段)

都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到陌生,重要的是思路的变换,以前用jq随便拿全局变量和修改dom的锤子不能用了,vue只用关心数据本身,不用再频繁繁琐的操作do... 查看详情

实战篇:一行命令安装linux系统,超详细的vagrant上手指南(代码片段)

一行命令安装Linux演示:vagrantboxaddbento/oracle-7.9--providervirtualbox&&sudovagrantinitbento/oracle-7.9&&sudovagrantup通过上述演示,已成功安装Linux7.9,并且可以访问。前言最近发现了一款神器Vagrant࿱ 查看详情

实战篇:一行命令安装linux系统,超详细的vagrant上手指南(代码片段)

一行命令安装Linux演示:vagrantboxaddbento/oracle-7.9--providervirtualbox&&sudovagrantinitbento/oracle-7.9&&sudovagrantup通过上述演示,已成功安装Linux7.9,并且可以访问。前言最近发现了一款神器Vagrant࿱ 查看详情

超详细pytorch入门教程(代码片段)

...其他操作Pytorch入门教程(一)请参考:【超详细】Pytorch入门教程(一)学 查看详情

安装图文并茂,插件体验超棒,vscode这款编辑器神器详细教程来了(代码片段)

你是否正在努力为Python编程和数据科学寻找最佳的代码编辑器?今天我将向你展示我最喜欢的一款工具,它就是VisualStudioCode,一款来自微软的一个完全免费的代码编辑器,它是迄今为止我发现的最灵活、功能最丰... 查看详情

numpy超详细教程:ndarray的内部机理及高级迭代(代码片段)

 系列文章地址NumPy最详细教程(1):NumPy数组NumPy超详细教程(2):数据类型NumPy超详细教程(3):ndarray的内部机理及高级迭代ndarray对象的内部机理在前面的内容中,我们已经详细讲述了ndarray的使用,在本章的开始部分,... 查看详情

游戏开发教程unitycinemachine快速上手,详细案例讲解(虚拟相机系统|新发出品|良心教程)(代码片段)

文章目录一、前言二、插件下载三、案例1:第三人称自由视角,FreeLookcharacter场景1、场景演示2、组件参数2.1、CinemachineBrain:核心2.2、CinemachineFreeLook:第三人称自由视角相机2.2.1、设置Follow:跟随2.2.2、设置Loo... 查看详情

nmap使用教程图文教程(超详细)(代码片段)

Nmap使用教程一、端口扫描1.指定端口2.指定扫描方式2.1TCP全连接扫描2.2SYN半链接扫描2.3隐秘扫描二、主机探测三、服务识别四、系统识别五、扫描结果导出kali的命令行中可以直接使用nmap命令,打开一个「终端」,输入nmap... 查看详情

echarts实现数据可视化入门教程(超详细)(代码片段)

ECharts实现数据可视化入门教程(超详细)ECharts介绍ECharts入门教程第一步:下载并引入scharts.js文件第二步:编写代码目录结构编写index.html代码效果展示ECharts的基础配置主要配置(常用的)案例讲解补充示... 查看详情

04unityar2022vuforia——虚拟按钮超详细教程含代码(代码片段)

【04】UnityAR2022Vuforia——虚拟按钮超详细教程【含代码】虚拟按钮超详细教程【含代码】目录【04】UnityAR2022Vuforia——虚拟按钮超详细教程【含代码】1.前期工作2.创建VirtualButton3.创建Cube和Sphere4.虚拟按钮命名5.完成小tips以便于测... 查看详情

k8s核心组件详细介绍教程(配超详细实例演示)(代码片段)

本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来k8s核心组件介绍1.Namespace2.Pod1.pod相关命令2.实例——创建一个包含redis容器... 查看详情

k8s核心组件详细介绍教程(配超详细实例演示)(代码片段)

本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来k8s核心组件介绍1.Namespace2.Pod1.pod相关命令2.实例——创建一个包含redis容器... 查看详情

超详细pytorch入门教程(代码片段)

Pytorch基本语法1认识Pytorch2Pytorch的基本元素操作3Pytorch的基本运算操作4关于TorchTensor和Numpyarray之间的相互转换5总结1认识Pytorch什么是Pytorch?Pytorch是一个基于Numpy的科学计算包,向它的使用者提供了两大功能.作为Numpy的替代者,... 查看详情

超详细博客入门编写教程(代码片段)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左... 查看详情