C_05_编译4阶段

news2024/11/15 7:42:01
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/2078979.html

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

相关文章

【ArcGIS/GeoScene Pro】离线许可归还不了

问题&#xff1a; 解决方案&#xff1a; 将一下项置空即可&#xff0c;让后重新获取许可信息

网络安全售前入门01——产品了解

目录 1.概述 2.常见网络安全产品 2.1下一代防火墙&#xff08;NGFW&#xff09; 3.后续 1.概述 为方便初入网络安全售前工作的小伙伴了解网安行业情况&#xff0c;我制作一系统售前入门&#xff08;安全产品&#xff0c;安全服务&#xff0c;法律法规等&#xff09;介绍&am…

AI创新,DataOps聚能 | 白鲸开源DTCC共话DataOps新篇章

近日&#xff0c;由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会&#xff08;DTCC 2024&#xff09;隆重召开。大会以“自研创新 数智未来”为主题&#xff0c;吸引了数百位行业专家和广大数据领域从业者共聚这场年度数据库技术交流盛宴&#xff…

vs2019 C++ 无法定位程序输入点于动态链接库

问题 一个项目一段时间没运行后&#xff0c;再运行报以下错误&#xff1a; 无法定位程序输入点??0lnferenceEngineExceptiondetailslnferenceEngine QEAAAEBV? b a s i c s t r i n g D U ? basic stringDU? basicstringDU?char traitsDstd v?$allocatorD2 stdHOZ 于动…

解决 python import 报错问题

需求问题描述 期望用Python写工具&#xff0c;转换excel内容合并到xml中&#xff0c;需要用到 openpyxl & lxml 库&#xff0c;因此需要安装。 import openpyxl 提示报错&#xff0c;但是没有像java代码的解决方案推荐&#xff0c;即无法直接导包。 分析记录 Note&#…

React antd 表格嵌套表格(可展开)

注意&#xff1a; 采用的是React antDsign 4.x版本 实现效果 代码实现 import { Space, Table } from antd; import React, { useRef } from react;const CheckList () > {const data [{id: 1,name: 张三,age: 18,content: [{id: 1-1,text: 我叫张三,},],},{id: 2,name:…

城管执法系统源码,城市管理综合执法监督系统,微服务架构,后端框架采用springboot ,支持二开

Java智慧城管系统源码 数字城管APP系统源码 城市管理综合执法监督系统源码&#xff0c;移动执法APP源码。 智慧城管系统开发技术&#xff1a; 技术架构&#xff1a; 微服务 开发语言&#xff1a; java 开发工具&#xff1a;idea、VSCode 前端框架&#xff1a;vueeleme…

2024焊工操作证考试在线模拟考试题

焊工证考试试题分为理论《焊工理论知识》考试和《焊工实操知识》专业能力考核。 焊工证考试试题理论知识考试采用闭卷电脑答题方式&#xff1b;理论知识考试和实操考核均实行百分制&#xff0c;焊工证考试成绩皆达80分及以上者为合格。 以下为焊工理论考试模拟试题&#xff0c…

模型案例:| 音频识别-报警器声音识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

【解析几何笔记】10.向量的外积

10. 向量的外积 10.1 向量外积的定义 α β \pmb{\alpha}\times\pmb{\beta} αβ是一个向量&#xff0c; α β \pmb{\alpha}\times\pmb{\beta} αβ垂直于 α \pmb{\alpha} α和 β \pmb{\beta} β所在的平面&#xff0c;至于朝上还是朝下&#xff0c;取决于 α , β , α …

mysql 导入excel文件 navicate

需求&#xff1a; 需要将表格的数据&#xff0c;导入到mysql数据库&#xff0c;如果存在就更新&#xff0c;如果不存在就进行追加。 处理&#xff1a; 这种就用navicate进行操作。 excle表格&#xff1a; 平台流水号用户姓名来电号码联系电话通讯地址电子邮箱闽-20231221000…

如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

LLM 安全培训和越狱

Meta、Google、OpenAI、Anthropic 等在公开发布之前都投入了大量精力来审查其模型的输出,并设置安全使用的护栏。尽管他们付出了努力,但越狱仍然会发生,即使是最新版本也是如此。根据 [1],GPT4 很容易受到基于说服的攻击,事实上比旧版 ChatGPT 更容易受到攻击。 新的和更复…

identYwaf:一款基于盲推理识别技术的WAF检测工具

关于identYwaf identYwaf是一款功能强大的Web应用防火墙识别与检测工具&#xff0c;该工具基于盲推理识别技术实现其功能&#xff0c;可以帮助广大研究人员迅速识别目标Web应用程序所使用的保护防火墙类型。 功能介绍 identYwaf所实现的盲推理通过检查一组预定义的测试性&…

论坛系统登录测试结果

目录 1 登录成功1.1 输入合法已注册手机号 2 登录失败2.1 输入未注册手机号2.2 输入非法手机号2.3 输入错误、过期验证码 论坛系统——部分测试用例 1 登录成功 1.1 输入合法已注册手机号 打开登录界面 输入已注册手机号 点击发送验证码 输入验证码&#xff0c;点击登录按钮 …

出现“此网站无法提供安全的连接,使用了不受支持的协议”的解决方法

在访问网站时&#xff0c;出现“此网站无法提供安全的连接”这一提示信息&#xff0c;指出网站所用的协议未得到支持。同时&#xff0c;错误代码“ERR_SSL_VERSION_OR_CIPHER_MISMATCH”表明&#xff0c;这一问题可能与ssl版本或加密算法的不兼容有关。经过一系列的测试发现&am…

ant-design-vue的table组件的首列复选框设置问题,包括设置默认选中,设置禁选条件

想要使用表格的复选框列并控制复选框是否可选&#xff0c;先上代码如下 html部分<a-table :rowKey"(record,index)>{return record.id?record.id: index}":columns"columns" :data-source"tableData":row-selection"showSelection?…

html+css网页设计 个人网页《我的2023》3个页面

htmlcss网页设计 个人网页《我的2023》3个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

React Native键盘的两种适配方案

方案一&#xff1a; import {KeyboardAvoidingView} from react-native; import {useHeaderHeight} from react-navigation/elements;const headerHeight useHeaderHeight();<KeyboardAvoidingViewbehavior{padding}keyboardVerticalOffset{headerHeight}style{styles.con…

投稿必看——计算机类SCI全名单汇总

【SciencePub学术】本期&#xff0c;小编给大家总结了计算机领域的SCI全名单&#xff0c;以供此领域的学者们投稿参考&#xff01; 来源&#xff1a;WOS数据库 目前&#xff0c;被WOS数据库收录的计算机类SCI期刊共518本&#xff0c;影响因子最高的当属《IEEE Communications S…