【c语言】组件化打包—静态库lib

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

本文基于

链表组件化封装

字符串组件化封装

在组件化封装好的基础上进行静态库打包…

组件化打包—动态链接库


一、静态库

静态库是一种包含已编译代码的集合,可以在链接时与应用程序一起链接到最终可执行文件中。

包含多个目标文件(.o/.obj),这些文件是通过编译和汇编源代码生成的。静态库被认为是静态的,因为它们在链接时被完全复制到可执行文件中,而不需要动态加载。
使用静态库可以使得应用程序更加独立,不需要运行时链接库的存在,但是会增加可执行文件的大小。

我们只能使用库里面函数的功能,但是看不到库里面函数的实现

二、创建静态库

1.创建新项目

创建一个项目名称为测试组件的空项目

在这里插入图片描述
在解决方案中新建项目——选择静态库

在这里插入图片描述
在这里插入图片描述

2.复制组件化文件

把准备好的组件化代码复制到静态库的项目文件夹

在这里插入图片描述
在vs解决方案中添加现有项目: 把刚复制进去的组件化头文件和源文件添加到解决方案中

在这里插入图片描述

3.添加头文件声明

每个源文件中添加#include “pch.h”

  • 务必放在第一行!!
  • 每个源文件都要写!!!

在这里插入图片描述
#include “pch.h” 未在第一行产生的错误:
在这里插入图片描述

4.生产静态库文件lib

在这里插入图片描述

然后就可以在项目所在文件夹——debug中看到打包好的静态库文件

在这里插入图片描述

如果产生错误:试图执行此项目。 可能是库项目不是可执行文件


同理之前的字符串和链表组件也同样添加进来

链表组件化封装

字符串组件化封装


二、使用静态库

1.复制静态库到项目

在这里插入图片描述
在这里插入图片描述

2.添加预编译指令

在这里插入图片描述

添加加载组件的预编译指令:

在这里插入图片描述

3.测试

调试执行:

在这里插入图片描述

测试示例代码:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "lib/arrays.h"
#include "lib/string_pro.h"
#include "lib/collections.h"
#pragma comment(lib,"./lib/StaticArrayLib.lib")  //加载 库
#pragma comment(lib,".\\lib\\StaticStringLib.lib")
#pragma comment(lib,".\\lib\\StaticLinkLib.lib")
typedef struct score
{
	char name[30];
	int math;
	int english;
	int chinese;
}SCORE, * P_Score;
P_Score createSCORE(const char* name,int m,int e,int c   )
{
	P_Score p = (P_Score)malloc(sizeof(SCORE));
	strcpy(p->name , name);
	p->math = m;
	p->english = e;
	p->chinese = c;
	return p;
}
int cmp(void* a,void* b)
{
	P_Score pa = (P_Score)a;
	P_Score pb = (P_Score)b;
	return pb->math- pa->math   ;
}

int cmpSum(void* a, void* b)
{
	P_Score pa = (P_Score)a;
	P_Score pb = (P_Score)b;
	return (pb->math+pb->english+pb->chinese  ) - (pa->math+pa->english+pa->chinese);
}
int main()
{
	PLinkedList list = createLinkedList();	//测试组件内的函数
	add(list, createSCORE("天喜",100,89,97));
	add(list, createSCORE("张三", 88, 89, 71));
	add(list, createSCORE("紫棋", 98, 78, 69));
	add(list, createSCORE("椰子", 66, 11, 78));
	add(list, createSCORE("李四", 100, 78, 97));
	add(list, createSCORE("王五", 59, 35, 100));

	sort__(list,cmp );

	iterator(list);
	while (  hasNext(list) )
	{
		P_Score p = (P_Score)next(list);
		printf("%s %d %d %d\n",p->name,p->math,p->english,p->chinese);
	}
	sort__(list, cmpSum);

	iterator(list);
	while (hasNext(list))
	{
		P_Score p = (P_Score)next(list);
		printf("%s %d %d %d\n", p->name, p->math, p->english, p->chinese);
	}

	//回收内存
	iterator(list);
	while (hasNext(list))
	{
		P_Score p = (P_Score)next(list);
		free(p);
	}
	clear(list);
	free(list);
	list = NULL;

	/*int arr[] = {1,2,3,6,97,5,3,48,3};
	sort(arr, ARRAY_LENGTH(arr), ASC);
	for ( int i=0,len = ARRAY_LENGTH(arr); i<len; i++)
	{
		printf("%d\n",arr[i]);
	}

	char str[] = "TianXi Studio";
	toUpperCase(str);
	printf("%s\n",str);*/
	return 0;
}

静态库lib总结

静态库:

  • 移植方便

  • 文件体积大
  • 空间浪费
  • 不易更新

将组件化打包位静态库的过程:编译好的目标文件,通过编号、索引、压缩打包为静态库文件lib
在其他的项目中添加打包好的静态库文件,就可以直接使用其中的函数

但是静态库存在浪费空间的问题,并且静态库对程序的更新、部署和发布页会带来麻烦

如果静态库libxx.lib更新,所有使用它的应用程序都需要重新编译,用户也要重新下载程序文件

因此有一种弥补静态库缺点的——动态链接库

组件化打包—动态链接库

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
部分内容:  用C 语言编程时,通常要建立一些用户函数。如果这些函数具有通用性,一般的方法是将它们作成头文件,当需要时用“#include”命令将其包含到源程序之中,以提高编程效率。但在特定的程序中一般仅使用这些函数的一部分,若用上述方法包含所有函数,编译器在编译的时候会把所有包含进的函数都进行编译,这无疑会使源程序变得庞大而难于理解,并会影响执行效率。建立用户目标模块库(lib文件)可以解决这个问题,你可以事先把有特定功能的通用的子函数集编译完成后生成的obj文件打入lib文件,当链接器tlink.exe在进行链接操作时,便只会把程序内部用到的通用函数所在的obj文件链接进来(已验证:不能定位到具体函数),这样生成的obj文件便会更精简,生成的exe文件也更小。   其实,一个lib文件是obj文件的集合。当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件。我们可以通过tlib.exe(在tc2.0下的根目录)来对lib文件进行操作,你可以把自己生成的obj文件通过tlib命令加入到一个lib文件中,也可以把lib文件内的obj文件进行删除操作,还可以把内部的obj文件给提取出来。明白了lib文件的大致结构以及对它的具体操作,在学习C语言的过程中,就会又多了一个切入点对C语言具体实现进行研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值