当前位置: 首页 > 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…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...