广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言库的封装和使用方法总结
  • 722
分享到

C语言库的封装和使用方法总结

2024-04-02 19:04:59 722人浏览 薄情痞子
摘要

目录前言windows下静态库创建和使用静态库的创建静态库的使用方法一:添加工程中方法二:配置项目属性方法三:使用编译语句静态库优缺点缺点windows下动态库创建和使用静态库中生成

前言

库是已经写好的、成熟的、可复用的代码。在我们的开发的应用中经常有一些公共代码是需要反复使用的,就把这些代码编译为库文件。

库可以简单看成一组目标文件的集合,将这些目标文件经过压缩打包之后形成的一个文件。像在Windows这样的平台上,最常用的C语言库是由集成按开发环境所附带的运行库,这些库一般由编译厂商提供。

windows下静态库创建和使用

静态库的创建

创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入staticlib。点击确定。

在解决方案资源管理器的头文件中添加,mylib.h文件,在源文件添加mylib.c文件(即实现文件)。

mylib.h


#ifndef MYLIB_H
#define MYLIB_H

int myadd(int a, int b);
#endif

mylib.c


# include "mylib.h"
int myadd(int a, int b) {
	return a + b;
}

配置项目属性。(右击项目名),因为这是一个静态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“静态库(.lib)。

编译生成新的解决方案,在Debug文件夹下会得到mylib.lib (对象文件库),将该.lib文件和相应头文件给用户,用户就可以使用该库里的函数了。

 

静态库的使用

方法一:添加工程中

就像你添加.h和.c文件一样,把lib文件添加到工程文件列表中去。

切换到"解决方案视图"选中要添加lib的工程–>点击右键–>“添加”–>“现有项”–>选择lib文件–>确定。

说明:

mylib.h可以不引入项目,引入的作用是为了方便用户了解库中提供的方法及作用。

方法二:配置项目属性

添加工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录。

添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。

然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名。

方法三:使用编译语句


#pragma comment(lib,"./mylib.lib")

静态库优缺点

  •  静态库对函数库的链接是放在编译时期完成的,静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;
  • 程序在运行时与函数库再无瓜葛,移植方便。
  • 浪费空间和资源,所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

缺点

内存和磁盘空间

静态链接这种方法很简单,原理上也很容易理解,在操作系统和硬件不发达的早期,绝大部门系统采用这种方案。随着计算机软件的发展,这种方法的缺点很快暴露出来,那就是静态链接的方式对于计算机内存和磁盘空间浪费非常严重。特别是多进程操作系统下,静态链接极大的浪费了内存空间。在现在的linux系统中,一个普通程序会用到c语言静态库至少在1MB以上,那么如果磁盘中有2000个这样的程序,就要浪费将近2GB的磁盘空间。

程序开发和发布

空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。比如程序中所使用的mylib.lib是由一个第三方厂商提供的,当该厂商更新容量mylib.lib的时候,那么我们的程序就要拿到最新版的mylib.lib,然后将其重新编译链接后,将新的程序整个发布给用户。这样的做缺点很明显,即一旦程序中有任何模块更新,整个程序就要重新编译链接、发布给用户,用户要重新安装整个程序。

windows下动态库创建和使用

要解决空间浪费和更新困难这两个问题,最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不是将他们静态的链接在一起。简单地讲,就是不对哪些组成程序的目标程序进行链接,等程序运行的时候才进行链接。也就是说,把整个链接过程推迟到了运行时再进行,这就是动态链接的基本思想。

创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入mydll。点击确定。

在解决方案资源管理器的头文件中添加,mydll.h文件,在源文件添加mydll.c文件(即实现文件)。

在mydll.h文件中添加如下代码:


#pragma once
//内部函数
//int mySub(int a, int b);

//外部函数 导出函数
__declspec(dllexport)int mySub(int a, int b);

5.在test.c文件中添加如下代码:


#include "mydll.h"
// __declspec(dllexport)可以省略
int mySub(int a, int b) {
	return a - b;
}

配置项目属性。因为这是一个动态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“动态库(.dll)。

编译生成新的解决方案,在Debug文件夹下会得到mydll.dll (对象文件库),将该.dll文件、.lib文件和相应头文件给用户,用户就可以使用该库里的函数了。

静态库中生成的.lib和动态库生成的.lib是不同的

动态库中的.lib只会放变量的声明和 导出函数的声明,函数实现体放在.dll中

__declspec(dllexport)是什么意思?

动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。

动态库的lib文件和静态库的lib文件的区别?

在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。

动态库的使用

方法一:隐式调用

创建主程序TestDll,将mydll.h、mydll.dll和mydll.lib复制到源代码目录下。

(P.S:头文件mydll.h并不是必需的,只是c++中使用外部函数时,需要先进行声明)

在程序中指定链接引用链接库 : #pragma comment(lib,"./mydll.lib")


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#pragma  comment( lib,"./mydll.lib")

int main(){

	printf("10 - 20 = %d\n", mySub(10, 20));


	system("pause");
	return EXIT_SUCCESS;
}

方法二:添加工程中(如静态库的使用中方法一)

方法三:显式调用


	HANDLE hDll; //声明一个dll实例文件句柄
	hDll = LoadLibrary("mydll.dll"); //导入动态链接库
	MYFUNC minus_test; //创建函数指针
	//获取导入函数的函数指针
	minus_test = (MYFUNC)GetProcAddress(hDll, "myminus");

总结

到此这篇关于C语言库的封装和使用方法的文章就介绍到这了,更多相关C语言库的封装使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言库的封装和使用方法总结

本文链接: https://www.lsjlt.com/news/130361.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言库的封装和使用方法总结
    目录前言windows下静态库创建和使用静态库的创建静态库的使用方法一:添加工程中方法二:配置项目属性方法三:使用编译语句静态库优缺点缺点windows下动态库创建和使用静态库中生成...
    99+
    2022-11-12
  • C语言关于文件的操作方法总结
    目录什么是文件程序文件数据文件文件名为什么要使用文件文件的操作文件缓冲区文件指针(FILE)文件的打开和关闭fopenfclose文件的打开方式流的相关概念文件的顺序读写fputcf...
    99+
    2022-11-12
  • C 语言结构体的使用方法
    目录C 语言结构体使用1. 结构体的声明和定义1.1 介绍1.2定义的几种类型2. 结构体初始化3. 结构体成员访问4. 结构体传参C 语言结构体使用 1. 结构体的声明和定义 1....
    99+
    2022-11-12
  • C语言用封装方法实现飞机大战游戏
    目录一、项目描述和最终的成果展示二、用函数进行封装三、新型的发射子弹功能四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能五、订正一些BUG和完成一些美化本文实例为大家分享了C语言用...
    99+
    2022-11-13
  • C语言实现求解素数的N种方法总结
    目录前言必备小知识C语言详解《试除法》求解素数试除法境界1试除法境界2试除法境界3试除法境界4C语言详解《筛选法》求解素数筛选法境界5前言 哈喽各位友友们,我今天又学到了很多有趣的知...
    99+
    2023-01-28
    C语言实现求解素数 C语言求解素数 C语言 素数
  • C语言结构体的具体使用方法
    目录初识C语言结构体1.为什么要有结构体2.结构体的定义2.1结构体类型的定义2.2定义结构体普通变量及访问2.3定义结构体指针变量及访问初识C语言结构体 1.为什么要有结构体 (1...
    99+
    2022-11-12
  • Go语言中常用的基础方法总结
    目录字符串1.使用正则表达式验证字符串2.字符串和数字的相互转换3.格式化字符串时间1.字符串和时间的相互转换2.时间的比较切片映射接口延迟函数指针结构体并发字符串 1.使用正则表达...
    99+
    2022-11-11
  • C语言格式输出二进制的2种方法总结
    目录1.前言2.源码实现3.结果展示附:C语言如何将一个数字的二进制形式输出出来总结1.前言 在我们日常的编程中,有时候需要格式化输出一个整形数据的二进制,但是在我们C语言中只有 输...
    99+
    2022-11-13
    c语言以二进制形式输出 c语言怎么输出二进制数 C语言二进制显示
  • C语言怎么用封装方法实现飞机大战游戏
    本文小编为大家详细介绍“C语言怎么用封装方法实现飞机大战游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么用封装方法实现飞机大战游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、项目描述和最终的成...
    99+
    2023-06-30
  • Go语言Zap库Logger的定制化和封装使用详解
    目录前言Go 语言原生的LoggerGo 语言原生Logger的缺点Zap 日志库Zap 的使用方法安装zap设置 Logger定制 Zap 的 Logger日志切割封装 Logge...
    99+
    2022-11-13
  • wingIDE的安装与使用方法总结
    Wing IDE 是一个集成开发环境(IDE),主要用于编写和调试 Python 程序。以下是 Wing IDE 的安装和使用方法的...
    99+
    2023-09-14
    wingIDE
  • C语言数组长度的计算方法实例总结(sizeof与strlen)
    目录前言1. 数组的创建2. 求解数组的长度注意:总结:前言 最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清。因此做个总结。 首先要明白什么是数组。 数组是一组相同...
    99+
    2022-11-13
  • C语言将音视频时钟同步封装成通用模块的方法
    目录前言一、视频时钟1、时钟计算方法2、同步视频时钟3、同步到另一个时钟二、音频时钟1、时钟计算方法(1)、时间公式 公式一(2)、计算方法2、同步音频时钟(1)、阻塞式(2)、回调...
    99+
    2022-11-13
  • Go语言中调用外部命令的方法总结
    目录引子运行命令显示输出显示到标准输出输出到文件发送到网络保存到内存对象中输出到多个目的地运行命令,获取输出分别获取标准输出和标准错误标准输入环境变量检查命令是否存在封装总结引子 在...
    99+
    2022-11-11
  • C语言使用四种方法初始化结构体
    目录什么是结构体结构体的优点定义方法一:定义时赋值方法二:定义后逐个赋值方法三:定义时乱序赋值(C风格)方法四:定义时乱序赋值(C++风格)什么是结构体 在实际问题中,一组数据往往有...
    99+
    2022-11-12
  • C语言指针使用的方法
    这篇文章主要介绍了C语言指针使用的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言指针使用的方法文章都会有所收获,下面我们一起来看看吧。指针指针是一个变量(1) 作用:只能存储地址的值(2) 大小:32...
    99+
    2023-07-02
  • 一文总结C++运算符的使用方法
    目录1. 算术运算符2. 关系运算符3. 逻辑运算符4. 按位运算符5. 取地址运算符6. 取内容运算符7. 成员选择符8. 作用域运算符1. 算术运算符 算术运...
    99+
    2023-05-20
    C++运算符总结 C++ 运算符
  • C语言中位运算符"|"的5种高级用法总结
    目录前言一、将两个字节合并成一个16位整数二、将一个字节的低4位和高4位交换三、将一个字节中的某些位置1四、将一个字节中的某些位置0五、将低位连续的0变为1小结前言 在上一篇文章中,...
    99+
    2023-05-15
    C语言位运算符I用法 C语言位运算符I C语言位运算符
  • C语言case语句使用的方法有哪些
    C语言case语句可以使用的方法有:1. switch语句中使用case语句:在switch语句中使用case语句可以根据不同的条件...
    99+
    2023-06-14
    case语句
  • C语言 超详细总结讲解二叉树的概念与使用
    目录1.二叉树的概念及结构 2.二叉树链式结构的实现1.二叉树的概念及结构  ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作