【Linux环境】编译器 gcc/g++的使用

news2025/1/23 7:23:29

在这里插入图片描述

​👻内容专栏: Linux操作系统基础
🐨本文概括: 预处理、编译、汇编、链接、动静态库、gcc选项等。
🐼本文作者: 阿四啊
🐸发布时间:2023.9.13

背景知识

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

如何用gcc进行编译

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

📌gcc命令记忆技巧:ESc(键盘左上角键) + iso(镜像文件后缀)

预处理(进行宏替换)

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

编译(生成汇编)

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

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

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

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

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

函数库

  • 在这里涉及到一个重要的概念叫做函数库
  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
    [Asi@localhost ~]$ ldd mybin
    	linux-vdso.so.1 =>  (0x00007fff7e5e9000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007f0c99260000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f0c9962d000)
    

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

  • 动态库(动态链接):是C/C++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式关联起来。所谓的动态链接,其实是将要链接的库中的函数地址拷贝到我们可执行程序的特定位置。

    优点:形成的可执行程序小,有利于节省系统的开销。
    缺点:强依赖性,动态库没了,那么,所有与动态库关联的程序都无法运行。

  • 静态库(静态链接):是C/C++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中。

    优点:可以独立运行,无需额外的库文件。
    缺点:可执行文件大,导致磁盘空间的浪费。
    ⚠️注:默认情况下,XShell中是没有安装静态库的,只有动态库,如果要安装,执行以下命令:

    👇C语言静态库

    [Asi@localhost ~]$ sudo yum install -y glibc-static
    

    👇C++静态库

    [Asi@localhost ~]$ sudo yum install -y libstdc++-static
    
  • 演示
    创建一个test.c文件,写入一段C语言代码。
    在这里插入图片描述
    test.c文件动态链接(gcc编译器默认情况下链接的是动态库)取名为test-d

    [Asi@localhost ~]$ gcc test.c -o test-d
    

    再次将test.c文件静态链接(需要添加-static选项)取名为test-s

    [Asi@localhost ~]$ gcc test.c -o test-s -static
    

    对比发现,动态链接后生成的可执行文件的大小与静态链接后生成的可执行文件大小相差了近百倍,所以gcc下为什么默认情况下生成动态链接库。

    [Asi@localhost ~]$ ll
    total 876
    -rw-rw-r-- 1 Asi Asi    127 Sep 12 15:40 test.c
    -rwxrwxr-x 1 Asi Asi   8480 Sep 13 15:47 test-d
    -rwxrwxr-x 1 Asi Asi 861216 Sep 13 16:22 test-s
    

gcc选项

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element-ui文件下载(单个)

1. 单个附件下载 <el-buttontype"text"size"small"click.native.prevent"download(scope.row)" >下载</el-button>export default {data() {return {downloadUrl: http://127.0.0.1:8881/XX/XX, // 下载接口}},methods: {download(…

骨传导耳机怎么听到声音?骨传导耳机是否会对听力造成损害?

其实骨传导耳机让我们听到的的传声原理很简单&#xff0c;而且骨传导现象很常见&#xff0c;简单的来说&#xff0c;就是像我们平时吃薯片或者挠头发&#xff0c;无论声音再小&#xff0c;自己也能听见&#xff0c;这就是骨传导的现象&#xff0c;也是为啥骨传导耳机不需要入耳…

【SpringMVC】JSON注解异常处理的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Spring MVC》。&#x1f3…

【Axure高保真原型】日历日期原型模板

今天和大家分享日历日期的原型模板&#xff0c;包括月计划、周计划、日计划的原型案例&#xff0c;以及日期、时间、月份、区间选择器……具体效果可以点击下方视频观看 【原型预览及下载地址】 Axure 原型 备用地址&#xff1a;Untitled Document 【原型效果】 【原型效果…

ABAP 获取信贷超额函数

业务需求&#xff1a;在创建销售订单时&#xff0c;信贷超额不会影响单据正常生成&#xff0c;前台信贷超额消息时前台弹框式警告&#xff0c;故而不会在BAPI RETURN中返回&#xff0c;也许需要获取这类消息&#xff0c;返回给外围系统。 函数&#xff1a;SD_DELIVERY_CREDIT_C…

利用面向对象方法,处理数据文件【Python】

题目背景&#xff1a;处理两份数据文件&#xff08;文本数据和JSON数据&#xff09;&#xff0c;用面向对象的方法&#xff0c;效果图用柱状图呈现。 本题思路&#xff1a; 1.首先&#xff0c;创建一个【基础数据类】&#xff0c;名为Record&#xff0c;它将包含成员属性和成员…

【数据结构-堆】堆

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

嵌入式行业这个领域是否值得坚持

今日话题&#xff0c;嵌入式行业&#xff0c;特别是对于嵌入式新人&#xff0c;是否值得坚持这个领域&#xff1f;对于想要进入嵌入式行业的人来说&#xff0c;坚持是明智的选择。这个领域涉及硬件和软件&#xff0c;技术更新较慢&#xff0c;但它也为你提供了积累经验的机会。…

mysql学习查缺补漏1---基础部分(小滴课堂)

举例&#xff1a; DDL&#xff1a;建库&#xff0c;建表。 DML&#xff1a;对表的数据进行增删改操作。 DQL&#xff1a;对数据进行查询。 DCL&#xff1a;对用户的权限进行设置。 create table teacher as select * from student where 12; 该条语句只用于复制表结构&…

Kubernetes 使用configmap挂载卷给Pod内的nginx容器

目录 实验&#xff1a;使用configmap挂载卷给Pod内的nginx容器 1、创建nginx.conf配置文件&#xff08;必须由nginx镜像里的nginx.conf修改而来&#xff0c;防止出现配置不相似的情况出现&#xff0c;导致访问不了nginx网页&#xff09; 2、通过nginx.conf文件创建configmap容…

Java 代理模式之静态代理与动态代理

1&#xff0c;代理模式 代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。 代理模式的目的&#xff1a; &#xff08;1&#xff09;通过引入代理对象的方式来间接访问目标对象&#xff0c;防…

对话式人工智能(Conversational AI):提高模型的智能程度和扩展能力

对话式人工智能的趋势与挑战 对话式人工智能 (AI) 已经出现在许多家庭的客厅、汽车和在线购物体验中。聊天机器人、语音助手、智能扬声器、交互式语音识别系统&#xff1a;所有这些都是对话式 AI 的示例。由于该领域通过增强的客户体验提供了更多可访问性&#xff0c;因此吸引…

PHP自己的框架2.0结合容器技术(重构篇二)

目录 1、使用容器实现框架加载类运行 2、 创建框架容器类core/fm/Di.php 3、框架使用容器类来执行public/index.php 4、运行效果还是一样 1、使用容器实现框架加载类运行 2、 创建框架容器类core/fm/Di.php 什么是容器&#xff1f;容器就相当于盒子&#xff0c;把很多类放里…

录音怎么转换成mp3格式?支持二十多种格式

录音怎么转换成mp3格式&#xff1f;在我们的日常生活和工作中&#xff0c;录音是一项非常有用的工具&#xff0c;随着手机以及录音设备越来越普及化&#xff0c;让录音这件事情变得非常的简单&#xff0c;录音可以帮助我们解决非常多的事情。例如通过录音&#xff0c;我们可以记…

Linux C++ OpenVINO 物体检测 Demo

目录 main.cpp #include <iostream> #include <string> #include <vector> #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> #include <dirent.h> #include <stdio.h> #include <time.h> #include …

OJ练习第171题——复制带随机指针的链表

复制带随机指针的链表 力扣链接&#xff1a;138. 复制带随机指针的链表 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个…

Temu新手入门需要注意哪些细节?如何在Temu中添加尺码?

要在temu平台取得商业成功&#xff0c;创业者们必须注重商品策划和市场调研、关注市场动向和用户反馈、建立良好的互动和交流机制、发挥temu的优势和特点&#xff0c;本文介绍了temu新手入门需要注意细节以及如何在TEMU中添加尺码&#xff0c;快来学习一下吧。 temu新手入门需…

使用Javassist修改组件化 Router

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;TransformDemo

Python中数据去重的重要性、技巧和实现代码

在数据处理和分析的过程中&#xff0c;数据去重是数据处理和分析的关键步骤之一。重复的数据会导致分析结果的偏差&#xff0c;影响决策的准确性。通过数据去重&#xff0c;我们可以确保分析所使用的数据集是干净、准确的&#xff0c;从而提高分析结果的可靠性&#xff0c;Pyth…

【LeetCode题目详解】第十章 单调栈part03 84.柱状图中最大的矩形(day60补)

本文章代码以c为例&#xff01; 一、力扣第84题&#xff1a;柱状图中最大的矩形 题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 …