C 06 编译4阶段

news2024/11/16 19:47:44
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.coloradmin.cn/o/2076267.html

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

相关文章

Claude 3.5 Sonnet引入了LaTeX公式渲染功能!!

终于&#xff0c;Claude 也引入了LaTeX公式渲染功能&#xff0c;消息一出&#xff0c;评论区的网友们热议不断。 【最新版】手把手Claude 3.5 Sonnet 详细步骤注册方法&#xff01;_claude 3.5 sonnet 注册 早在 ChatGPT 率先支持 LaTeX 语言用于输入和显示数学公式时&#xf…

[从0开始AIGC][LLM]:LLM中Encoder-Only or Decoder-Only?为什么主流LLM是Decoder-Only?

LLM中Encoder-Only or Decoder-Only & 为什么主流LLM是Decoder-Only&#xff1f; 文章目录 LLM中Encoder-Only or Decoder-Only & 为什么主流LLM是Decoder-Only&#xff1f;1. 什么是Encoder-only、Decoder-Only2. 为什么当前主流的LLM都是Decoder-only的架构低秩问题 …

欧瑞康oerlikon PECVD 系统 KAI MT R1.0 模块化 操作说明

欧瑞康oerlikon PECVD 系统 KAI MT R1.0 模块化 操作说明

HTML5手机端通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 文章信息界面1.3 文章列表界面1.4 双列文章列表界面1.5 通用标签界面1.6 联系我界面1.7 折叠框标签界面1.8 相关界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作…

如何给笔记本或台式机顺利升级内存条

先查一下主板还有无剩下卡槽 win r 输入命令 taskmgr 调用后台查看 获取两个关键信息 速度 2666MHZ &#xff0c;卡槽 2/4 意味着还剩下两个空卡槽 接下来 用鲁大师纯净版查一下主板型号 鲁大师 v5.21.1300 绿色纯净版 - 果核剥壳 (ghxi.com) 查完之后&#xff0…

如何使用双重IP代理实现更安全的网络访问

在进行网络爬虫或其他需要隐匿真实IP的操作时&#xff0c;单一的代理IP有时并不能完全满足我们的需求。为了进一步提高安全性和隐私保护&#xff0c;我们可以使用双重IP代理。本文将详细介绍如何使用Java实现双重IP代理&#xff0c;帮助你在网络环境中更加游刃有余。 什么是双重…

TOMCAT “tom小猫”向你招手!!赶紧学起来!

一、WEB技术 1.1HTTP协议和B/S 结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。…

文件系统 -文件的基本了解

文章目录 一、文件的基本了解1. 文件 内容 属性2. 文件被访问之前&#xff0c;要被打开3. 谁在打开文件&#xff1f; 二、fopen()w 方式打开文件① 基本使用&#xff1a;② 标准重定向&#xff1a; a 方式打开文件① 基本使用&#xff1a;② 重定向&#xff1a; fopen&#x…

Runtime:源码解析Golang 的map实现原理

go version 1.15.6 map作为一种常见的 key-value 数据结构&#xff0c;不同语言的实现原理基本差不多。首先在系统里分配一段连接的内存地址作为数组&#xff0c;然后通过对map键进行hash算法(最终将键转换成了一个整型数字)定位到不同的桶bucket(数组的索引位置)&#xff0c;然…

【国产游戏行业的崛起与挑战:技术革新与全球市场机遇】

近年来&#xff0c;国产游戏行业确实取得了显著的发展&#xff0c;不仅在技术水平上不断提升&#xff0c;而且在国际市场上也崭露头角。然而&#xff0c;面对全球游戏市场的激烈竞争&#xff0c;国产游戏技术仍面临一些挑战和机遇。 首先&#xff0c;国产游戏在原创IP方面存在…

Autodesk系列软件批量激活工具出现许可证管理器版本不被支持问题解决方案!

使用Autodesk系列软件批量激活工具时&#xff0c;如果出现许可证管理器版本不被支持。 解决办法&#xff1a; 1、确定您安装的最高Autodesk软件版本。 例如&#xff0c;如果您同时安装了AutoCAD2020和Inventor 2022,那么您应该下载2022版对应的AdskLicensing。 说明&#xf…

汽车信息安全--攻破SecOC,就在今天!

目录 1.SecOC和系统安全&#xff1f; 2.破解实录 2.1 破解安全访问授权 2.2 程序控制的漏洞 3.小结 2020年左右&#xff0c;汽车信息安全开始在业内普及。 对于这种新概念&#xff0c;部分OEM仍采取以往开发模式&#xff0c;在不影响软件架构的大背景下&#xff0c;直接进…

企业级NoSql数据库Redis集群

一、关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 …

OpenHarmony中的fastjson gson应该这样用

【问题背景】 随着越来越多的开发者开始投入北向应用的开发&#xff0c;无数的人开始问我&#xff1a;鸿蒙三方库是否有fastjson&#xff0c;是否有gson&#xff0c;当前json和对象的转换要怎么搞。 作为程序员&#xff0c;我的每个项目都逃不掉fastjson/gson等三方库&#x…

C++基础知识5 string

string 1. string类1.1 C语言中的字符串 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for2.3 string类的常用接口说明 3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数6. vs和g下string结构的说明7. string类的模拟实现8.写时拷贝(…

认知杂谈35

今天分享 有人说的一段争议性的话 I 《日常藏宝&#xff0c;多留意》 嘿&#xff0c;你想想看哈&#xff0c;生活里那些让咱佩服得不行的小窍门&#xff0c;其实都藏在咱平常的小事儿里呢。 I 就好比啊&#xff0c;很多有用的道理其实就在咱身边晃悠&#xff0c;就看咱有没有…

nginx访问控制、用户认证、https

nginx访问控制 用于location段 Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开 Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开 //deny [rootnginx ~]# vim /usr/local/nginx/conf/nginx.conflocation /stat…

【数据结构篇】~链式二叉树(附源码)

链式二叉树 前言&#xff08;含头文件&#xff09;头文件 1.链式二叉树的组成2.前、中、后、层序遍历1.前序遍历2.中序遍历3.后序遍历 3.结点个数以及高度等​4.判断二叉树是否为完全二叉树 前言&#xff08;含头文件&#xff09; 之前的堆是特殊的二叉树是顺序结构的二叉树&a…

python库(20):Jsonschema库描述JSON数据的规范

1 Jsonschema简介 在当今信息时代&#xff0c;数据规范与交换变得越来越重要&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络通信与前后端数据交互。 JSON Schema是一种用于描述JSON数据的规范…

计算机二级题--函数(scanf)章节

1.scanf函数 1. 2. A:默认使用scanf函数的时候&#xff0c;如果空格&#xff0c;回车或跳格就结束了&#xff0c;不能再继续输入了 (同上知识点&#xff09;