【linux】Linux编译器-gcc/g++使用

先写一段代码演示

    1 #include<stdio.h>
    2 #define M 100
    3 int main()
    4 {
    5 printf("hello linux");
    6 printf("hello linux");
    7 //printf("hello linux");
    8 //printf("hello linux");
    9 //printf("hello linux");
   10 //printf("hello linux");
   11 //printf("hello linux");
   12 //printf("hello linux");
   13 //printf("hello linux");
   14 //printf("hello linux");
   15 //printf("hello linux");
   16 //printf("hello linux");
   17 printf("hello linux");
   18 
   19 printf("hello M");
   20 printf("%d",M);                                                                                                                                                   
   21 } 

1.预处理

gcc -E test.c -o test.i//这条指令-E的含义是从现在开始进行程序翻译,预处理完成,就停下.

生成test.i在这里插入图片描述

vim test.i//打开预处理生成的文件

1.头文件展开

我们发现多了800多行代码
在这里插入图片描述

stdio.h库中库函数都在这个路径下面
在这里插入图片描述

我们使用vim打开该头文件下的库
在这里插入图片描述

我们发现代码中多的八百多行代码,其实就是头文件展开了,去注释后两者一样.

2.宏替换

vim再次打开test.i
在这里插入图片描述
对比test.c 和test.i 发现宏定义消失,宏定义的M被直接替换成了100,而字符串中出现的M不会被替换掉.

3.去掉注释

再次对比发现test.c中的注释也被去掉了
在这里插入图片描述

4.条件编译

在预处理阶段,还会处理条件编译,在公司推出一款软件时,往往会出现社区版,以及个人版等,实现功能不太语言,那公司是由一套代码维护还是多套呢?
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dc28a491f89b4e35bd429f0b8adab61d.png

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
不同的条件编译(这里宏定义M2)就可以实现社区版和个人版用同一套代码维护啦!!

我们也可以通过命令行来进行不同的条件编译

gcc -DM2=1 test1.c

这条指令条件编译,宏定义 M2 1

总结:预处理完成宏替换,去注释,头文件展开,条件编译


2.编译

gcc -S test.i -o test.s//这条指令-S代表从现在开始进行程序的编译,编译完成就停下来

生成了test.s文件在这里插入图片描述

vim打开test.s
在这里插入图片描述

发现代码已经变成汇编代码,里面都是汇编指令
总结:编译过程将c语言代码变成汇编语言,此时如果出现变量名没写对会出现编译错误,会进行语法检查


3. 汇编

gcc -c test.s -o test.o//-c选项从现在开始进行程序的翻译,汇编完成就停下来.

生成了test.o
在这里插入图片描述

vim打开test.o
在这里插入图片描述

我们在vs中也会生成这种obj目标文件在这里插入图片描述

总结:汇编过程是将汇编语言变成二进制目标文件


4.链接

 gcc test.o -o test.exe//形成可执行程序

形成可执行程序
在这里插入图片描述

总结:链接生成可执行程序


5.c++中的函数重载

1.创建一个.cpp文件
在这里插入图片描述

add函数满足参数类型不同构成重载函数
2.g++编译代码

g++ -o my.exe add.cpp// -o后面接着是生成文件的别名

在这里插入图片描述

3.查看汇编代码

objdump -S my.exe

在这里插入图片描述
为什么c++支持函数重载,而c语言不支持函数冲重载,c语言依靠函数名来区分不同函数,而c++会对重载的函数名加以修饰。


6.编译器的自居过程

当我们没有c语言时,我们用的是汇编语言编程,当没有汇编语言时,我们用的是二进制编程.
在这里插入图片描述
而我们c语言的翻译过程就是历史推演的逆过程.我们想一想图中1过程简单,还是2过程简单呢?
当然是2过程了,因为前人已经可以将汇编语言转成二进制了,就是我们的汇编过程.
那是先有编译器呢?还是先有语言呢?第一个汇编编译器是怎么得到的呢?第一个c语言编译器又是怎么得到的呢?
首先编译器是个软件,软件由编译器写的,我们使用二进制编程可以写一个汇编的编译器,然后通过汇编的编译器就可以编写汇编的语言了,然后我们可以用汇编的语言写一个c语言的编译器,然后通过c语言的编译器就可以写c语言了,这就是编译器的自居过程.


7.链接精讲

链接是我们的程序和库结合的过程,语言一定要有自己的标准库,比方说我们写了一个程序,需要使用printf函数,这个printf函数就是标准库里面的.
链接分为动态链接和静态链接,链接可以让我们提高开发效率,比如说我们要实现人物的移动通过键盘,我们可以使用图形库中的函数GetAsyncKeyState来实现,这样是将我们的程序和图形库链接起来.

1.在Linux系统下利用ldd指令查看动态库依赖关系;

在这里插入图片描述

2.我们将所依赖的动态库在上述路径下,我们ls -l 这个路径下,发现有个库文件
在这里插入图片描述

linux
动态库:.so
静态库:.a
windows
动态库:.dll
静态库: .lib
链接时,动态库进行动态链接,静态库进行静态链接

1.如何理解动态链接和静态链接?
讲一个小故事帮助理解,假如说你在一个高中上学,你在学校里要有你自己的作息,相当于任务,假如说上网是你的作息的一种,你的老学长会告诉你网吧的地址,网吧的机子是你上网的方法。这里你的老学长就相当于你的编译器,会告诉你目标库的地址,然后你的作息是你要执行的程序,包括上网,网吧就是你的动态库,动态库里面的机子就是你的方法,也就相当于你要调用标准库里面的printf函数,假如说有人向派出所举报了这个网吧,也就相当于共享的动态库被删除,要使用这个动态库的函数就不行了,如果将电脑机子搬回你的学校寝室,也就相当于在编译的时候,把库中的方法拷贝到我自己的程序中了.
2.c动态库是默认提供的,gcc默认形成可执行程序,默认采用动态链接
3.动态库,动态链接地优缺点
不能丢失,也就是不能删库
节省资源
静态库,静态链接的优缺点
一旦形成,和库无关
浪费资源

优点缺点
动态库节省资源不能丢失,也就是不能删库,一旦缺失,所有程序都无法运行
静态库一旦形成,和库无关,可移植性高浪费资源,静态链接生成程序体积大

在这里插入图片描述
gcc编译默认生成动态库

如果要静态链接,输入指令( 比动态多-static)

gcc he.c -o he.exe -static

会出现下面这个情况,默认情况,linux一般静态库都是没有安装的
在这里插入图片描述


静态库安装(c语言)

sudo yum install glibc-static

静态库安装(c++)

sudo yum install -y libstdc++-static

 gcc he.c -o he3.exe -static//静态链接指令

在这里插入图片描述静态比动态大好多,是动态一百倍.

但是如果我们向别人发送一个可执行程序时,对方没有安装对应的标准库,动态库对对方来说是编不了的,虽然静态库大,但是他会把库里面的方法都拷贝你的可执行程序中,这样就可以在别人的电脑里跑了,这也是静态链接产生的程序为什么容量大的原因了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

【江科大】STM32:中断系统(理论)

文章目录 中断系统为什么要使用中断中断优先级中断嵌套STM32的中断系统如何管理这些中断NVIC的结构![请添加图片描述](https://img-blog.csdnimg.cn/c77b038fd63a4ddfbcd3b86f6dfe596b.png) 优先级窗口看门狗&#xff08;WWDG&#xff09;&#xff1a;外部中断模块的特性&#…

unity刷新grid,列表

获取UIGrid 组件&#xff0c;更新列表 listParent.GetComponent().repositionNow true;

【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…

Python基础之数据库操作

一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注&#xff1a;通过pip安装&#xff0c;可能会提示需要更新pip&#xff0c;这时可执行&#…

could‘t get post build model module: xx.app.main variant:xxdebbug

当androidStudio进行run应用的时候,报错&#xff1a; couldt get post build model module: xx.app.main variant:xxdebbug后经过排查&#xff0c;方案如下&#xff1a; invalidate caches 清除缓存&#xff08;全部勾选&#xff09;&#xff1b; 删除 .gradle 目录&#xff…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址&#xff1a;https://bz.zzzmh.cn/index逆向接口一&#xff1a;https://api.zzzmh.cn/bz/v3/getData逆向接口二&#xff1a;https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…

eNSP学习——理解ARP及Proxy ARP

目录 名词解释 实验内容 实验目的 实验步骤 实验拓扑 配置过程 基础配置 配置静态ARP 名词解释 ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。   动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

TensorRT英伟达官方示例解析(二)

系列文章目录 TensorRT英伟达官方示例解析&#xff08;一&#xff09; TensorRT英伟达官方示例解析&#xff08;二&#xff09; 文章目录 系列文章目录前言一、03-BuildEngineByTensorRTAPI1.1 建立 Logger&#xff08;日志记录器&#xff09;1.2 Builder 引擎构建器1.3 Netwo…

关于 LLM,你了解多少?

LLM定义 大语言模型&#xff08;LLM&#xff09;是一种基于大量文本数据训练的深度学习模型。它的主要功能是生成自然语言文本或理解语言文本的含义。这些模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、对话等&#xff0c;是通向人工智能的一条重要途径。 LLM发…

什么是通配监听端口? 什么是通配监听IP?

什么是通配监听端口? 监听端口&#xff1a; 指的是服务器或服务开启的特定TCP或UDP端口号&#xff0c;等待客户端连接或发送数据。TCP/IP协议下每个端口只能由一个服务独占监听&#xff0c;一个服务或应用会指定监听特定的一个或多个端口来接收客户端的连接请求。 例如 Web…

计算机网络基础概念解释

​ 1. 什么是网络 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;于是有了网络互连。 网络互连&#xff1a;将多台计算机连接在⼀起&#xff0c;完成数据共享。 数据共享本质是…

JRT集中打印

之前一直在夯实基础&#xff0c;现在是补demo的时段了。了解过检验集中打印的人知道&#xff0c;集中打印的逻辑有多复杂。既要考虑普通检验报告加上换页。又要考虑微生物报告加上换页&#xff0c;既有A5的报告&#xff0c;也有A4的报告&#xff0c;还要考虑A4打印两个组装A5时…

小程序学习-21

目前小程序分包大小有以下限制&#xff1a; 整个小程序所有分包大小不超过 20M单个分包/主包大小不能超过 2M 独立分包&#xff1a;"independent": true

书生·浦语大模型实战营-学习笔记5

LMDeploy 大模型量化部署实践 大模型部署背景 LMDeploy简介 轻量化、推理引擎、服务 核心功能-量化 显存消耗变少了 大语言模型是典型的访存密集型任务&#xff0c;因为它是decoder-by-decoder 先把数据量化为INT4存起来&#xff0c;算的时候会反量化为FP16 AWQ算法&a…

windows资源管理器占用过高CPU的问题

最近&#xff0c;笔者的电脑在进行文件操作时变得异常的卡顿&#xff0c;打开任务管理器发现windows资源管理器占用了50%-80%的CPU。这里指的文件操作包括但不限于解压&#xff0c;复制&#xff0c;粘贴&#xff0c;甚至重命名一个文件夹都会引起50%的CPU占用。起初笔者认为可能…

缓解Spring Core的“Spring4Shell”零日漏洞

一、概述 2022年3月30日&#xff0c;安全社区广泛注意到Spring&#xff08;一种流行的开源Java框架&#xff09;爆出的一个漏洞。Akamai自适应安全引擎第一时间检测到基于该漏洞发起的零日攻击&#xff0c;为Akamai客户提供了保护。 该漏洞的披露时间线以及其他通过非正式方式…

docker报错 missing signature key 无法拉去镜像,yum install docker-ce没有可用软件包 解决办法

错误场景描述 今天项目需要用到minio&#xff0c;我打算在虚拟机中使用docker装一个&#xff0c;可是发现当我docker pull minio/minio的时候&#xff0c;报错了missing signature key 这个报错提示的让人很蒙&#xff0c;翻译过来的意思是 “缺少签名密钥” &#xff1f;&am…

大小鼠行为刺激-ZL-034B大小鼠跳台仪/多通道跳台记录仪

小鼠跳台实验是一种常用的学习记忆实验方法&#xff0c;它基于条件反射原理&#xff0c;通过观察小鼠在电栅和平台之间跳跃的行为&#xff0c;来研究药物对学习和记忆过程的影响。它适用于各种增智健脑、提高记忆、抗衰老药物和保健品筛选、开发研制。它是初筛药物的理想工具&a…