C_05_编译4阶段

c语言编译的4个阶段:预处理、	编译、	汇编、	链接
预处理阶段会在源代码中查找预编译指令,其中主要是头文件展开(include),宏定义(defind),选择性编译(ifdef)三种指令
预处理命令以符号 # 开头优势:1 扩展了c程序设计的环境2 简化了程序开发过程3 提高程序的可读性
注意:1 实际上不是c语言的一部分【只是一点小技巧】2 预编译指令在编译前由预处理程序对源文件的预处理文件进行加工。

1 include

作用:

# 引入头文件在预编译编译阶段会将该行代码 替换 为引入的头文件中的代码

语法:

语法1:

​ #include <要引入的头文件> 引入的是系统提供的头文件

语法2:

​ #include “要引入的头文件” 先在当前目录下寻找,如果没有再去系统提供头文件目录下寻找。

注意:

1

include 经常用来包含头文件,可以包含源文件,但是大家不要包含源文件

头文件中也可以定义函数,但是不建议 定义函数

2

预编译只会对 include 等预处理操作进行处理并不会进行语法检查,下一阶段的 编译才会 检查语法对错

2 define

作用: 定义一个常量或者定义一段代码

分类:

  • 不带参宏
  • 带参宏

不带参宏:

静态宏定义
【一般用静态宏定义】

在这里插入图片描述

步骤:

​ 1 宏定义:

​ 静态定义

​ #define 宏名称 值

  			注意: 值可以可无

​ 2 使用宏

​ 宏名称

​ 3 取消宏【一般没人取消所以不理会】

undef 宏名称

​ 注意: 一旦取消,该宏就不能使用

使用范围:

​ 宏定义开始到取消宏

动态宏定义
【搞事7用动态宏定义】

在这里插入图片描述

带参宏

步骤:1,宏定义#define宏名称(形参列表)代码;2,使用宏宏名称(实参列表);3,取消宏#undef 宏名称带参宏与带参函数的区别带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏是浪费了空间,因为被展开多次,节省时间。带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要,压栈弹栈。有个调用的过程,所以说,带参函数是浪费了时间,节省了空间。带参函数的形参是有类型的,带参宏的形参没有类型名。

3 选择性编译

作用:选择性的对代码进行编译

在这里插入图片描述

头文件模板:

#ifndef 自定义宏#define 自定义宏引入头文件声明变量声明函数#endif

在这里插入图片描述

比如这样:

在这里插入图片描述

其他的正常就使用

注意:

  • 此时需要在该头文件对应的源文件中引入该头文件
  • 在使用该源文件中函数的源文件中再引入该头文件,此时不会重复声明

动态库与静态库

  • 动态编译使用动态库 生成的可执行程序小,对库的依赖大

    举例: 一般下载的软件后还需要进行更新 根本就是对依赖库的检查更新

  • 静态编译使用静态库 生成的可执行程序大,对库的依赖小

  • 当静态与动态库名重名 但是因为后缀不一样 所以使用命令不同的时候 就会调用不同的库产生不同的库文件本应该产生的效果

程序编译

分类:

静态编译
  						```markdown> gcc -static 源文件 -o 生成的可执行程序名```
动态编译

gcc 源文件名 -o 生成的可执行程序名

哪怕程序一样但是选择的不同方式进行编译结果不一样

在这里插入图片描述

第三方库 也就是就包含了 头文件和库文件

动态库:.so

【制作的时候有可能有一个bug 使用的时候需要注意有三个可能出现的bug】

制作:
gcc -shared 源文件名 -o lib生成的动态库名.so
举例: gcc -shared arr_utils.c -o libutils.so 
# 注意    起名对生成的动态库名  必须以 lib开头 结尾是.so  中间部分自己改
注意:
gcc -shared -fPIC 源文件名 -o   lib生成的动态库名.so     

在这里插入图片描述

使用:
情况一:
# 使用动态库的源文件与动态库在同一文件夹下gcc 源文件名 1ib动态库名.so -o 可执行文件名

注意:

在这里插入图片描述

如果在执行可执行程序时出现一下问题需要加入

这是为当前命令窗口添加环境后再去执行程序v

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH     // 单独起一行
情况二:【常出的问题】

之前是将头文件 源文件和库文件都在同一目录下 所以直接用

但是分文件后就得告知从哪去拿头 从那去拿库文件等…

# 使用动态库的源文件与动态库不在同一文件夹下

使用动态库的源文件与动态库不在同一文件夹下

gcc 源文件名 -o lib动态库名.so -L库文件路径 -l库名 -I头文件所在路径

【注意】:

-L 是指定库文件的路径
-l 指定找哪个库,指定的只要库文件名1ib后面.so前面的部分
-I 指定头文件的路径
如果出现一下问题,需要加入export LD_LIBRARY_PATH=库文件所在路径:$SLD_LIBRARY_PATH

在这里插入图片描述

情况三:

【不常用 因为担心库文件名和系统提供的库文件名 重名】

动态库文件在系统提供的文件夹

系统提供的文件夹/usr/lib			系统提供存储动态库的文件夹/usr/include		 系统提供存储头文件的文件夹
gcc 源文件名 -l库文件名 -o 生成的可执行文件夹

静态库:.a

制作:

1 将要编译为库文件的的源编译为二进制文件gcc -c 源文件名 -o 二进制文件名.o
2 将二进制文件转换为静态库文件ar  rc  lib库文件名.a  二进制文件名.o

使用:

情况一:

使用静态库的源文件与动态库在同一文件夹下

gcc -static 源文件名 1ib动态库名.a -o 可执行文件名
情况二:

使用静态库的源文件与动态库不在同一文件夹下

gcc -static 源文件名 -o 生成的可执行文件名 -L库文件路径 -1库名 -I头文件所在路径
情况三:

静态库文件在系统提供的文件夹

/usr/lib 			系统提供存储动态库的文件夹
/usr/include 		系统提供存储头文件的文件夹
gcc -static 源文件名 -l 库文件名 -o 生成的可执行文件夹

件名

情况二:

使用静态库的源文件与动态库不在同一文件夹下

gcc -static 源文件名 -o 生成的可执行文件名 -L库文件路径 -1库名 -I头文件所在路径
情况三:

静态库文件在系统提供的文件夹

/usr/lib 			系统提供存储动态库的文件夹
/usr/include 		系统提供存储头文件的文件夹
gcc -static 源文件名 -l 库文件名 -o 生成的可执行文件夹

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

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

相关文章

mybatis-plus添加replace(自定义)方法,添加sql注入器SqlInjector

1. 继承DefaultSqlInjector import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.springframework.stereotype.Compon…

Qt_信号槽机制

文章目录 Qt中的信号槽机制1.在widget.h添加处理函数的声明2.添加处理函数的定义3.建立信号和槽的连接4.运行 Qt中的信号槽机制 本质就是给按钮的点击操作&#xff0c;关联上一个处理函数&#xff0c;当用户点击的时候&#xff0c;就会执行这个处理函数。 函数&#xff1a;stat…

Upscayl 采用开源人工智能技术,可以增强低分辨率图像的效果。

Upscayl 是一款免费开源的基于 AI 神经网络与深度学习的「图片画质提升 / 超分辨率软件」&#xff0c;可以做到“无损放大图片”&#xff0c;让你轻松将任意分辨率的图片、照片、壁纸放大到高清、超清甚至 4K 水平&#xff0c;大幅提升图片细节表现与清晰度&#xff01;效果比起…

用Python实现时间序列模型实战——Day 2: 时间序列的基本统计量

一、学习内容 1. 自相关函数 (ACF) 与偏自相关函数 (PACF) 自相关函数 (ACF)&#xff1a; 自相关函数用于衡量时间序列在不同时间滞后下的相关性。它描述了序列与自身滞后版本之间的相关性&#xff0c;滞后时间越长&#xff0c;相关性通常会减弱。自相关函数的计算公式为&am…

浏览器 V8 引擎

V8 引擎是 Google 开发的高性能 JavaScript 和 WebAssembly 引擎&#xff0c;最初是为了提升 Google Chrome 浏览器的性能而设计的。自 2008 年首次发布以来&#xff0c;V8 引擎不仅仅被用在 Chrome 浏览器中&#xff0c;还被广泛应用于其他 JavaScript 环境中&#xff0c;比如…

嵌入式系统课后习题(带答案)

资料截图&#xff08;部分&#xff09;&#xff1a; &#x1f680; 获取更多详细资料可点击链接进群领取&#xff0c;谢谢支持&#x1f447; 点击免费领取更多资料

前端通过draggable结合fabricjs实现拖拽至画布生成元素自定义编排功能

前端通过draggable结合fabricjs实现拖拽自定义编排功能 太久没有更新了&#xff0c;主要最近行情不太好失业了一段时间&#xff0c;一度到怀疑人生&#xff0c;然后就是做的东西大多没有什么含金量&#xff0c;没什么好分享的就很尴尬。 刚好最近遇到一个奇葩的需求&#xff0…

【李林880-2025版本】个人错题01 第十六章节——喻老讲解版

十六章 这里需要注意的是三个设的变量都要满足的不等式条件 根据题目的最长中间的一段需要满足大于其他两个变量的不等式条件 最后根据几何概型方法求出概率 两个情况 重要思想[逆事件] &#xff1a;7个正品找到了3个次品都找到了 这里首先从六个空中选出两个次品位置&…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…

C++ 设计模式——代理模式

C 设计模式——代理模式 C 设计模式——代理模式1. 主要组成成分2. 逐步构建代理模式2.1 抽象主题类定义2.2 真实主题类实现2.3 代理类实现2.4 主函数 3. 代理模式 UML 图代理模式 UML 图解析 4. 代理模式的优点5. 代理模式的缺点6. 代理模式的分类7. 代理模式和装饰者模式比较…

深度学习——分布式训练

目录 1. 前言2.分布式训练的分类3.不并行&#xff08;单机单卡&#xff09;4. 数据并行 DP和DDP4.1 异同点4.2 原理4.3 DP 实现&#xff08;单机多卡&#xff09;4.4 DDP 实现&#xff08;单机多卡&#xff0c;多机分布式&#xff09;4.4.1DDP 基本概念4.4.2 DDP之单机多卡4.4.…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、克隆项目&#xff0c;测试 安装完成&#xf…

一文读懂大语言模型:基础概念篇

在当今AI时代&#xff0c;大语言模型正以前所未有的速度重塑我们的世界。作为NLP领域的明星&#xff0c;它们不仅理解语言&#xff0c;更创造语言&#xff0c;开启了智能交互的新纪元。 本文将介绍着重介绍大模型的概念&#xff0c;帮助大家简单了解其技术原理、发展历程&#…

Autosar(Davinci) --- 创建一个Implementation Data Types

前言 这里我们讲一下如何创建一个Implementation Data Types&#xff08;IDT) 一、什么是IDT 二、如何创建一个IDT 鼠标右键【Implementation Data Types】,选择【new Type Reference...】 起一个名字【IdtDoorState】&#xff0c;Data Types选择【boolean】&#xff0c;这里…

海康VisionMaster使用学习笔记18-常见问题排查

常见问题排查思路 常见问题排查方法-安装阶段 常见问题排查方法-启动阶段 常见问题排查方法-使用阶段 常见问题排查方法-相关资料 关于VisionMaster使用的学习笔记到这里告一段落了,继续海康二次开发的学习. 海康二次开发 海康相机二次开发学习笔记1-环境配置

设计模式-结构型模式-适配器模式

1.适配器模式定义 将类的接口转化为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作&#xff1b; 1.1 适配器模式的优缺点 优点 将目标类和适配者类解耦&#xff0c;通过引入一个适配器类来重用现有的适配者类&#xff0c;无需修改原有结构&#x…

linux安装elasticsearch

只考虑单机的情况&#xff0c;因为没有那么大的需求 首先创建个文件夹用于存放elasticsearch cd /opt/mkdir modulecd module根据官网提示下载 官网文档链接 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.0-x86_64.rpmwget https://artifac…

USB详解,配置及难点

一、USB发展历史 二、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、…