当前位置: 首页 > news >正文

【Linux】Linux中gcc/g++的使用

  • 本期主题:程序的编译过程和gcc/g++的使用

博客主页:小峰同学
分享小编的在Linux中学习到的知识和遇到的问题
小编的能力有限,出现错误希望大家不吝赐

🍁 1.背景知识

预处理(进行宏替换,去注释,头文件的展开,条件编译)
编译(生成汇编)
汇编(生成机器可识别代码)
连接(生成可执行文件或库文件)

🍁 2.gcc如何完成编译

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

2.1.预处理(进行宏替换)

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

写一段测试代码
执行指令

用vim打开预处理后的test.i文件。
并和源文件进行比对:可以清楚的看到预处理阶段,源程序做的那些事情。
可以看到预处理后的还是C语言的程序。

结果就是这个

可以测试条件编译(在源文件里面定义,和在外面定义都一样)
也就是宏的命令行定义。

深层理解:
我们可以看到,预处理阶段,会把头文件拷贝到源文件里面,所以这个头文件一定在我们系统中存在,或者在库中存在,就相当于我们在某一个平台写代码的时候,这个头文件不是写着玩的,而是这个必须在系统中确确实实存在,在Linux下的头文件在 " ./usr/include/stdio.h"
头文件存在的意义:
帮我们写代码,支持代码自动补齐。
可以使用vim打开看一看系统中的头文件,

2.2.编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把C语言代码翻译成汇编语言。 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。 实例: gcc –S test.i –o test.s
打开里面是汇编语言,都是一些助记符,这就汇编语言。汇编语言和体系结构有很大关系。

但是汇编语言并不能被计算机直接执行,下一步就是汇编生成二进制

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

汇编阶段是把编译阶段生成的“.s”文件(汇编语言)转成二进制目标文件 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了 实例: gcc –c test.s –o test.o

执行汇编阶段的指令

用vim打开汇编阶段生成的 二进制目标文件。
可以看到此时我们已经看不懂了。

只能使用指令: "od test.o" 用二进制方式打开。

深入理解:
这里已经是一个机器可以识别的二进制目标文件,但是还是不能被执行。上面的三个步骤都只是在编译自己的代码,最后我们还要进行最后一步,就是链接c标准库,我们调用的一系列C语言函数,都是c标准库里面提前写好的,并且以及完成前三部预处理,编译,汇编。也是一个二进制目标文件。

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

把你写的代码和c标准库中的代码合起来。生成一个可执行程序。
实例:gcc test.o -o test

链接完成后就生成了可执行程序可执行的二进制文件,包含库加你的代码

帮助记忆:
看见盘的左上角 ESc 分别对应预处理,编译,汇编的指令。形成的临时文件对应后缀为 iso
gcc -(ESc) ------ test.(iso)

🍁 3.函数库(重要知识点)

3.1.动态链接和静态链接(感性的认识)

重要前提:
我们要清楚我们自己写的代码,和库是两码事。C标准库是别人已经给我们准备好的,让我们直接使用。我们的程序中用到的C语言函数(scanf ,printf,,,),其实我们自己只是写了函数的调用,并没有对应的实现!只有在链接的时候,对应的实现,才和我们的代码关联起来了。
链接的本质:
我们调用库函数的时候,和标准库是 怎么进行关联的。关联方式不同就是动态链接和静态链接的不同。

3.2.动态链接和静态链接(具体认识)

举个好认识的例子:小明去网吧的例子。
先直接编译链接出一个可执行程序
file test ,查看文件的具体信息。
ldd test :查看可执行程序依赖的动态库列表。

可以看到 Linux下默认使用的动态链接,使用的是静态库。
在Linux下库的命名:
动态库:libXXXX.so(XXXX为库的名称)
静态库:libXXXX.a(XXXX为库的名称)

选项-static 使用静态链接(注意自己是否安装静态库,后面有安装说明)

首先我们看到 静态链接的可执行程序大小比动态链接多很多。
Linux下的指令都是使用的动态库,所以电脑的动态库一定不能删除。
用这个库只有一个,但是这么多指令,这么多C语言成语程序,所以动态库也叫共享库。
所以以后我们写好的C语言程序我们就可以直接使用,可以共享同一个共享库。

静态链接的时候和动态库没有关系,拷贝的是"libc.a"静态库的东西。
一般系统会自动携带动态库:因为系统运行也需要动态库
不会自带静态库,需要我们自己安装静态库。
安装静态库指令:sudo yum install glibc -static
file静态链接的可执行程序。就可以看到静态链接完成。

3.3.c++的动静链接

c++中也和C语言相同默认是动态链接。
可以看到c++也有自己的动态库。
也可以-static 静态链接,也是需要自己安装的。
安装指令:sudo yum insatll -y libstdc++-static
和C语言相同。

系统为了支持我们编程,会给我们提供:标准库和标准库的 ".h"。
所以得到:我们的代码+库中的代码 == 可执行程序

上面我们讲到的,不只是在Linux下有效,在Windows下也是一样的原理。

window下的:
静态库:xxxx.dll
静态库:xxx.lib

🍁 4. gcc选项

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

相关文章:

【Linux】Linux中gcc/g++的使用

本期主题:程序的编译过程和gcc/g的使用博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐🍁 1.背景知识 预处理(进行宏替换,去注释,头文件的…...

【Spring Cloud Alibaba】(五)Dubbo启动报错?一直重连报错?你值得学习的是排查问题的方法

系列目录 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理实战 【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 源码详解 【Spri…...

adb命令的使用

命令 连接机顶盒 adb connect [机顶盒ip]查看已连接设备 adb devices断开某个机顶盒的连接 adb disconnect [机顶盒ip] or adb disconnect [虚拟机名称]断开所有设备连接 adb disconnect获取 root 权限 adb root挂载文件系统 adb remount当想往移动设备端 push 文件时显…...

springBoot自定义参数类型转换器

springBoot允许用户自定义转换器,以处理自定义请求参数协议。 方式一:通过实现接口:WebMvcConfigurer 并重写方法的形式。 Configuration public class BootConfig implements WebMvcConfigurer {/*** 自定义参数转换*/Overridepublic voi…...

OA系统在企业中的应用你知道哪些?

随着人工智能技术的不断发展,企业中的OA系统(Office Automation System)正在逐渐得到广泛应用。OA系统是一种集成了多种功能的信息化工具,能够帮助企业实现办公自动化、信息管理、决策支持等多种功能。本文将从OA系统在企业中的应…...

JAVA中,ArrayList 的扩容机制,含案例

JAVA中,ArrayList 的扩容机制,含案例 在 Java 中,ArrayList 是一个动态数组,它可以根据需要自动增长。当 ArrayList 中的元素数量超过其初始容量时,它会重新分配一个更大的内部数组,然后将现有元素复制到新…...

供应链的有效管理,分析指标有哪些

对于企业而言,供应链是一个很复杂的、体系化的生态系统,从原材料、到供应商、到生产、仓库、物流,最后到达经销商或者最终客户那里,这个链条很长。相关的分析指标也有很多,在这些指标里面也有非常多可以扩展、延申的内…...

嵌入式环境配置—VMware 软件安装和虚拟机的创建

目录 一、VMware软件的安装 二、虚拟机的创建 三、Linux操作系统的安装 VMware软件的安装 为什么要虚拟机? 嵌入式Linux开发需要在Linux系统下进行,我们选择了Ubuntu。 1.双系统安装 有问题,一次只能使用一个系统。Ubuntu基本只做编译用。需求&…...

阿里前端二面经典手写面试题汇总

实现类的继承 实现类的继承-简版 类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想…...

【Eye】Fake News Reading on Social Media: An Eye-tracking Study

Fake News Reading on Social Media: An Eye-tracking Study Abstract 在网上传播假新闻(以及一般的虚假信息)最近被认为是威胁整个社会的一个主要问题。这种传播在很大程度上是由于新的媒体形式,即社交网络和在线媒体网站。研究人员和从业…...

想学计算机,应该学什么专业?

我们在考虑想学计算机,应该学什么专业?这个问题的时候,每个人都应该结合自己的兴趣来确定。有的喜欢编程、有的喜欢设计、有的喜欢做产品跟人打交道……自己有兴趣再加上自己的努力,掌握好专业技能,就一定能进入高薪的…...

Android逆向之旅—反编译利器Apktool使用教程

apktool下载软件首先下载apktool.bat和apktool.jar官网地址:https://ibotpeaches.github.io/Apktool/install/配置环境变量具体的apktool命令自行百度apktool 解包与打包解包: apktool d xxx.apk打包: apktool b xxx1.jadx安装与使用下载exe或…...

色环电阻的阻值如何识别

这种是色环电阻,其外表有一圈圈不同颜色的色环,现在在一些电器和电源电路中还有使用。下面的两种色环电阻它颜色还不一样,一个蓝色,一个土黄色,其实这个蓝色的属于金属膜色环电阻,外表涂的是一层金属膜&…...

Dataway 让 Spring Boot 不再需要 Controller、Service、DAO、Mapper 简单接口直接开发。

新的sql语法可以先看一下官网&#xff0c;部署起来之后会用到Dataql&#xff1a; DataQL - 数据查询语言https://www.dataql.net/先看一下效果 接下来来实现一下。 1 创建spring boot项目 导入依赖 <!--begin dataWay--><!--hasor-spring 负责 Spring 和 Hasor 框架之…...

C#窗口介绍

窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找Load函数…...

SpringBoot:SpringBoot整合Junit 和 MyBatis(3)

SpringBoot整合Junit 和 MyBatis1. SpringBoot整合Junit2. SpringBoot整合MyBatis2.1 定义SpringBoot项目2.2 定义dao接口2.3 定义service层2.4 定义controller层2.5 配置yml/yaml文件2.6 postman测试1. SpringBoot整合Junit 在com.example.service下创建BookService接口 publ…...

Web自动化测试框架Selenium

作者&#xff1a;霍格沃兹测试开发学社 链接&#xff1a;https://www.zhihu.com/question/59854292/answer/2827875817 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 什么是自动化测试 自动化测试就是&#xff0…...

大数据系统自检

第一章 大数据计算系统概述 1.1 大数据计算框架概述 Hadoop Hadoop的运行过程&#xff08;5个步骤&#xff1f;&#xff09; split > map > shuffle > reduce > output Hadoop的详细运行过程&#xff1f;&#xff08;4个大过程&#xff0c;6662&#xff09; 创建…...

MySQL数据库操作

查看数据库语法show databases——列出所有的数据库 show databases [ like wild ];——列出和字符串wild名字相同的数据库 这里可以配合SQl的 "%" 和 "_" 通配符使用来查找多个数据库在SQL语句中"%"代表任意字符出现任意次数,"_"代表…...

线程安全实例分析

一、变量的线程安全分析 成员变量和静态变量是否线程安全&#xff1f; ● 如果它们没有共享&#xff0c;则线程安全 ● 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 —— 如果只有读操作&#xff0c;则线程安全 —— 如果有读写操作&am…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...