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

目录

一、预编译指令

1.1预处理功能

1.2指令

1.3问题扩展

二、编译(生成汇编)

 三、汇编(生成二进制机器语言)

四、链接(生成可执行文件或库文件)

4.1库文件

4.2目标文件和库的链接

4.3动态库和静态库的优缺点

五、debug和release


一、预编译指令

1.1预处理功能

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

1.2指令

  • 预处理指令是以#号开头的代码行
  • gcc下使用:gcc -E code.c -o code.i 来生成可执行文件
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
  •  选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

实例:

1.3问题扩展

  • 为什么能在Linux下进行C/C++或者其他形式的开发呢?

  1. C/C++开发环境不只是指gcc、g++、vs等编译器,更重要的是语言本身的头文件和库文件

  2. 在进行开发前,系统中一定要提前安装或者后续安装上C/C++相应的头文件和库

  3. 对于编译型语言,在选择对应的开发包进行下载时,必定也在同步下载头文件和库文件

  4. 使用ls /usr/include 可以查看Linux下包含的所以头文件

  • 条件编译的应用场景
  1. 根据编译条件,裁剪掉某些社区版编译器所不需要的功能
  • 经过预处理的源文件也是c语言

二、编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言

  •  用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

实例:gcc -S code.i -o code.s

 

 三、汇编(生成二进制机器语言)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件(可重定向二进制目标文件,.obj)
  • 可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码
  • 生成的目标文件虽然是二进制,但是不能独立运行,要和库进行链接形成可执行文件才能执行

实例:gcc -c code.s -o code.o

四、链接(生成可执行文件或库文件)

4.1库文件

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

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

  • 库文件实际上是.c(源文件)经过一定的翻译打包后形成的一个文件——可以达到只需要提供一个文件不需要提供多个源文件,隐藏源文件的功能
  • 软件=头文件中方法的声明+库文件中方法的实现+代码
  • Windows下存在以.dll为后缀的动态库和以.lib为后缀的静态库
  • Linux下存在以.so为后缀的动态库和以.a为后缀的静态库
  • 如何查看Linux的动态库和静态库?
ls /usr/lib64/libc.so*

ls /usr/lib64/libc.a*

4.2目标文件和库的链接

  • 动态链接 

动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时跳转到库中去执行相应的方法,执行结束后再回到代码调用处继续往下执行,这样可以节省系统的开销。动态库不能缺失,一旦缺失,所有依赖于动态库程序都无法正常运行。

动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。

  • 静态链接

静态库是指编译链接时,把库文件的代码全部拷贝加入到可执行文件中,因此生成的文件比较大,但再运行时,该目标问津不会再依赖库文件了。

4.3动态库和静态库的优缺点

  • 动态库:动态库为共享库,可以节约资源(磁盘空间,内存空间,网络空间);但动态库一旦缺失,所有依赖于该动态库的程序都无法正常运行
  • 静态库:程序不依赖库,静态库销毁,后续程序可以正常运行;体积大,不可以节约资源
  • Linux下,生成可执行文件时的默认为动态链接--需要提供动态库
  • Linux下,要按照静态链接的方式,在进行编译时要添加选项-static

实例:gcc code.c -o code.test

gcc code.c -o code.test_static -static

 

可以看出,按照静态链接的方式形成的可执行文件比动态链接形成的可执行文件大

  • 如果没有静态库,不能进行-static动态链接
  • 如果没有动态库,只有静态库,而且gcc能找到该静态库,那么可以进行静态链接
  • Linux默认优先动态链接,-static的本质:改变静态链接的优先级,只适配一次
  • 不一定所有的链接都是动态链接或静态链接,也有可能时动态链接和静态链接混合的

五、debug和release

  • Linux默认生成的release版本

  • debug版本的可执行文件会比release版本的略大

  • 要生成debug版本的可执行文件,可以在编译时添加-g选项

实例:gcc code.c -o code.test_debug -g
gcc code.c -o code.test_debug_static -g -static

 

  • 生成的可执行文件并不是无序的二进制格式,而是有自己的格式--ELF格式 
  • file指令

实例:file code.test

file code.test_static

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417294.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Django-Minio-Storage 使用教程】

Django-Minio-Storage 使用教程 安装 Django-Minio-Storage配置 Django 项目官方文档 安装 Django-Minio-Storage 使用 pip 安装 Django-Minio-Storage pip install django-minio-storage配置 Django 项目 在 Django 项目的 settings.py 文件中进行以下配置 INSTALLED_APPS…

【mysql】mysql修改sql_mode之后无法启动

现象:修改后mysql无法启动,不报错 原因:MySQL在8以后sql_mode已经取消了NO_AUTO_CREATE_USER这个关键字。去掉这个关键字后,启动就可以了 修改前: sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR…

Bootstrap前端框架Glyphicons字体图标

115工具网收集提供Bootstrap前端框架Glyphicons字体图标库对照表​​​​​​​,Bootstrap前端UI,Glyphicons字体图标调用,Bootstrap按钮字体图标对照表,包括250多个来自Glyphicon Halflings的字体图标.项目中引用Bootstrap相关文件后即可直接调用下列图标class&quo…

Linux CentOS安装PySpark3.5(单机版)详细教程及机器学习实战

目录 一、安装须知 二、安装Spark 1、下载安装包 2、修改配置文件spark-env.sh 3、验证Spark是否安装成功 三、安装py4j 四、配置环境变量 五、基于PySpark的机器学习实战 1、将数据文件上传HDFS 2、创建代码文件 3、提交应用程序 一、安装须知 前置依赖&#xff1…

Acrobat Pro DC 2023 for Mac/Win:全能型PDF编辑器深度解析

Adobe Acrobat Pro DC 2023作为一款跨平台的PDF编辑器,无论是对于Mac还是Windows用户,都提供了极为全面且强大的PDF处理功能。该软件凭借其卓越的性能和丰富的特性,成为了全球范围内用户处理PDF文档的首选工具。 一、强大的编辑功能 Acroba…

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码 1 比赛时间 北京时间:2024年9月5日 18:00-2024年9月8日20:00 2 思路内容 2.1 往届比赛资料 【2022高教社杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案…

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…

Claude的小白入门指南

要想快速上手Claude AI,其实并没有那么复杂。作为新一代的AI助手,Claude致力于为用户提供高效、无害、透明的交互体验。这篇入门指南将从Claude AI的特点、主要功能和如何实际操作等几个方面为大家做一个详细的介绍。 Claude AI是什么? Claud…

【SRC挖掘】越权漏洞——burp插件被动检测越权漏洞,一个插件让挖洞效率翻倍!Autorize

越权与未授权漏洞 越权漏洞什么是越权漏洞?Autorize插件安装使用步骤拦截过滤器 越权漏洞 什么是越权漏洞? 越权漏洞是指应用程序未对当前用户操作的身份权限进行严格校验,导致用户可以操作超出自己管理权限范围的功能,从而操作…

大模型笔记01--基于ollama和open-webui快速部署chatgpt

大模型笔记01--基于ollama和open-webui快速部署chatgpt 介绍部署&测试安装ollama运行open-webui测试 注意事项说明 介绍 近年来AI大模型得到快速发展,各种大模型如雨后春笋一样涌出,逐步融入各行各业。与之相关的各类开源大模型系统工具也得到了快速…

UnityShader自定义属性特性

前言: 在编写UnityShader时,我们常常会使用特性来更换材质球面板的属性外观,除此之外,还可以使用自定义的扩展脚本来实现自定义的材质球界面,参考我之前的文章UnityShaderUI编辑器扩展 但是自定义扩展每次都要单独写…

性能测试经典案例解析——远程培训系统

各位好,我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的专栏和我的主页 道普云 文章内容具有一定门槛,建议先赞再收藏慢慢学习,有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平…

5.sklearn-朴素贝叶斯算法、决策树、随机森林

文章目录 环境配置(必看)头文件引用1.朴素贝叶斯算法代码运行结果优缺点 2.决策树代码运行结果决策树可视化图片优缺点 3.随机森林代码RandomForestClassifier()运行结果总结 本章学习资源 环境配置(必看) Anaconda-创建虚拟环境…

Keil下载烧录程序到单片机提示flash outtime超时

Flash Timeout.Reset the Target and try it again. Error:Flash Download failed - “Cortex-M4” 解决方法: 1.检查杜邦线 2.RESET按键按一下再下载(或者一直按着下载),这样能让单片机进入烧录模式。 3.有外部看门狗,外部看门狗用跳帽屏…

『功能项目』DOTween动态文字【26】

打开上一篇25协程生成怪物模型的项目, 本章要做的事情是用DOTween插件做一个动态文字效果 首先在资源商店中免费下载一个DOTween插件 新建脚本:DowteenFlicker.cs 编写脚本: using DG.Tweening; using UnityEngine; using UnityEngine.UI;pu…

2024 年高教社杯全国大学生数学建模竞赛题目-C 题 农作物的种植策略

根据乡村的实际情况,充分利用有限的耕地资源,因地制宜,发展有机种植产业,对乡村经济 的可持续发展具有重要的现实意义。选择适宜的农作物,优化种植策略,有利于方便田间管理,提 高生产效益&#…

在模板中使用 Django 会话

在 Django 中使用会话(session)可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。 1、问题背景 在 Django 中,可以使用会话来存储用户数据。在某些情况下,我们…

Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

一、选题的背景 随着人们对天气的关注逐渐增加,天气预报数据的获取与可视化成为了当今的热门话题,天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

[数据集][目标检测]翻越栏杆行为检测数据集VOC+YOLO格式512张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):512 标注数量(xml文件个数):512 标注数量(txt文件个数):512 标注类别…

datagrip链接sql server2005报错

错误信息 第一次报 DBMS: Microsoft SQL Server (no ver.) Case sensitivity: plainmixed, delimitedexact [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client pr…