当前位置:   article > 正文

C语言 封装静态库/动态链接库_c封装成库

c封装成库

目录

组件化的意义

头文件及源代码

头文件:

源文件:

 提取头文件及源文件

第一步:先用文件资源管理器打开文件夹:

第二步:将头文件及源代码复制到桌面:

封装静态库

 第一步:创建一个静态库项目:

 第二步:将头文件与源代码添加到项目文件中:

第三步:处理代码:

 第四步:生成:

 第五步:找到库:

第六步:使用:

 封装动态链接库

第一步:添加一个动态链接库项目:

 第二步:将头文件和源文件添加到项目中:

 第三步:处理代码:

 第四步:生成:

​第五步:找到库:

第六步:使用:

静态库和动态链接库的区别


组件化的意义

组件化可以带来以下几个方面的意义:

  1. 可重用性:将应用程序拆分成多个独立的组件,可以使得这些组件可被复用于不同的应用程序中。
  2. 维护性:对于功能和代码变更,只需要修改对应的组件而不是整个应用程序,可以降低维护成本。
  3. 模块化开发:将应用程序拆分成多个独立的组件,可以使得多个团队并行进行开发,提高开发效率。
  4. 测试性:将应用程序拆分成多个独立的组件,可以针对每个组件进行单元测试,在保障质量的同时提高测试覆盖率。

头文件及源代码

以封装string有关的组件为例

头文件:

  1. #pragma once
  2. #include <string.h>
  3. #include <stdlib.h>
  4. /*
  5. 功能:判断一个字符串中是否包含另一个字符串
  6. 参数:str:目标字符长串
  7. substr:被查找的短字符串
  8. 返回:0 不包含 1包含
  9. 简例:int a = contains("Hello ,how are you","are");
  10. 返回 1;
  11. */
  12. int contains(const char* str,const char *substr) ;
  13. /*
  14. 功能:判断一个字符串的开头是否与另一个字符串相同
  15. 参数:str 目标字符串 substr被比较字符串
  16. 返回:0 否 1 是
  17. 简例:int a =startsWith("Hello ,how are you","Hello");
  18. 返回值:1
  19. */
  20. int startsWith(const char* str,const char *substr);
  21. /*
  22. 功能:判断一个字符串的结尾是否与另一个字符串相同
  23. 参数:str 目标字符串 substr被比较字符串
  24. 返回:0 否 1 是
  25. 简例:int a =endsWith("Hello ,how are you","are");
  26. 返回值:1
  27. */
  28. int endsWith(const char* str,const char *substr);
  29. /*
  30. 功能:从一个字符串前面寻找另一个字符串首次出现的下标
  31. 参数:str目标字符串,substr寻找字符串
  32. 返回:下标位置
  33. 简例:int a= strIndexOf("how are you","are");
  34. 返回值:4
  35. */
  36. int strIndexOf(const char* str,const char* substr) ;
  37. /*
  38. 功能:在一个字符串str前面开始寻找字符c首次出现的下标
  39. 参数:str目标字符串,c 被寻找的字符
  40. 返回:下标位置
  41. 简例:int a= charIndexOf("how are you",'w');
  42. 返回值:2
  43. */
  44. int charIndexOf(const char* str,char c) ;
  45. /*
  46. 功能:从一个字符串尾部开始寻找另一个字符串首次出现的下标
  47. 参数:str目标字符串,substr寻找字符串
  48. 返回:下标位置
  49. 简例:int a= strLastIndexOf("how do you do","do");
  50. 返回值:11
  51. */
  52. int strLastIndexOf(const char* str,const char* substr) ;
  53. /*
  54. 功能:在一个字符串str尾部开始寻找字符c首次出现的下标
  55. 参数:str目标字符串,c 被寻找的字符
  56. 返回:下标位置
  57. 简例:int a= charLastIndexOf("how are you",'o');
  58. 返回值:9
  59. */
  60. int charLastIndexOf(const char* str,char c) ;
  61. /*
  62. 功能:判断一个字符串是否空串
  63. 参数:str被检测的字符串
  64. 返回:0 不是 1 是
  65. 简例:int a = isEmpty("");
  66. 返回值 1
  67. */
  68. int isEmpty(const char* str) ;
  69. /*
  70. 功能:去掉字符串中的所有空格
  71. 参数:str 需要去掉空格的字符串
  72. 返回:处理后的str
  73. 简例:
  74. char s[] = " how are you ";
  75. trimAll(s)
  76. 返回值:howareyou
  77. */
  78. char* trimAll(char* str) ;
  79. /*
  80. 功能:只去掉字符串左侧的所有空格
  81. 参数:str: 需要去掉左侧空格的字符串
  82. 返回:处理后的str
  83. 简例:
  84. char s[] = " how are you ";
  85. leftTrim(s)
  86. 返回值:how are you |
  87. */
  88. char* leftTrim(char* str) ;
  89. /*
  90. 功能:只去掉字符串右侧的所有空格
  91. 参数:str: 需要去掉右侧空格的字符串
  92. 返回:处理后的str
  93. 简例:
  94. char s[] = " how are you ";
  95. rightTrim(s)
  96. 返回值: how are you|
  97. */
  98. char* rightTrim(char* str) ;
  99. /*
  100. 功能:把字符串的字母全部转换成大写
  101. 参数:str被变大写的字符串
  102. 返回:处理后的str
  103. 简例:
  104. char s[] = "how are you";
  105. toUpperCase(s);
  106. 返回值: HOW ARE YOU
  107. */
  108. char* toUpperCase(char* str ) ;
  109. /*
  110. 功能:把字符串的字母全部转换成小写
  111. 参数:str被变小写的字符串
  112. 返回:处理后的str
  113. 简例:
  114. char s[] = "IEEE1394";
  115. toUpperCase(s);
  116. 返回值: ieee1394
  117. */
  118. char* toLowerCase(char* str ) ;
  119. /*
  120. 功能:忽略大小写字母,比较两个字符串的大小
  121. 参数:str1 str2 两个比较的字符串
  122. 返回:1 大于关系 0 等于关系 -1小于关系
  123. 简例:int a=strcmpIgnorecase("Are","are");
  124. 返回值:0
  125. */
  126. int strcmpIgnorecase(const char* str1,const char *str2) ;
  127. /*
  128. 功能:对一个字符串进行翻转
  129. 参数:str被翻转的字符串
  130. 返回:翻转处理后的str
  131. 简例:char s[] ="12345";
  132. 返回值:54321
  133. */
  134. char* reserveStr(char *str);
  135. /*
  136. 功能:把一个s字符串重复连接n次后存放到d字符串
  137. 参数:d最终结果字符串,s被重复的字符串 n 重复的次数
  138. 返回:d最终结果字符串
  139. 简例:char a[50];
  140. repeat(a,"sorry!",3);
  141. 返回值:sorry!sorry!sorry!
  142. */
  143. char* repeat(char* d,const char *s ,int n) ;
  144. /*
  145. 功能:把一个长串中的一段字符串复制到另一个字符串。
  146. 参数:s 长串 from从 to到(但不包括) d存放位置
  147. 返回:d字符串的结果
  148. 简例:char d[20];
  149. substr("hello world",2,5,d);
  150. 返回值:llo
  151. */
  152. char* substr(const char* s,int from ,int to,char * d) ;
  153. /*
  154. 功能:把sub字符串插入到str的指定下标位置
  155. 参数:str目标字符串 sub被插入的子串 index 插入点下标。
  156. 返回:处理后的str
  157. 简例:
  158. char s[50]="how you";
  159. insert(s,"are ",3);
  160. 返回值:how are you
  161. */
  162. char* insert(char* str,const char *sub,int index) ;
  163. /*
  164. 功能:把字符串中指定下标的字符删除掉
  165. 参数:str目标字符串,index 被删除下标
  166. 返回:处理后的str
  167. 简例:char s[]="how you";
  168. deleteCharAt(s,1);
  169. 返回值:hw you
  170. */
  171. char* deleteCharAt(char* str,int index) ;
  172. /*
  173. 功能:把str字符串中的一段字符删除掉
  174. 参数:str被删除的字符串 from删除开始点 to 结束点(但不包括)
  175. 返回:处理后的str
  176. 简例:
  177. char s[]="how you";
  178. deleteSubstr(s,0,4);
  179. 返回值:you
  180. */
  181. char* deleteSubstr(char* str,int from ,int to) ;
  182. /*
  183. 功能:把字符串str的一小段字符替换成另一个字符串sub
  184. 参数:str目标字符串 from起始点,to结束点(但不包括) sub替换的内容
  185. 返回:处理后的str
  186. 简例:
  187. char s[50]="how is you";
  188. replace(s,4,6,"are");
  189. 返回值:how are you
  190. */
  191. char* replace(char* str,int from ,int to,const char * sub);
  192. /*
  193. 功能:把字符串str中的某些部分替换成另外的字符串
  194. 参数:str目标字符串 oldsub原来的内容 newsub 新的内容
  195. 返回:处理后的str
  196. 简例:
  197. char s[50]="how did you did";
  198. replaceAll(s,"did","do");
  199. 返回值:how do you do
  200. */
  201. char* replaceAll(char* str,const char *oldsub,const char* newsub) ;

源文件:

  1. #include"string_pro.h"
  2. /*
  3. 功能:判断一个字符串中是否包含另一个字符串
  4. 参数:str:目标字符长串
  5. substr:被查找的短字符串
  6. 返回:0 不包含 1包含
  7. 简例:int a = contains("Hello ,how are you","are");
  8. 返回 1;
  9. */
  10. int contains(const char* str, const char* substr)
  11. {
  12. return strstr(str, substr) != NULL;
  13. }
  14. /*
  15. 功能:判断一个字符串的开头是否与另一个字符串相同
  16. 参数:str 目标字符串 substr被比较字符串
  17. 返回:0 否 1 是
  18. 简例:int a =startsWith("Hello ,how are you","Hello");
  19. 返回值:1
  20. */
  21. int startsWith(const char* str, const char* substr)
  22. {
  23. return strstr(str, substr) == str;
  24. }
  25. /*
  26. 功能:判断一个字符串的结尾是否与另一个字符串相同
  27. 参数:str 目标字符串 substr被比较字符串
  28. 返回:0 否 1 是
  29. 简例:int a =endsWith("Hello ,how are you","are");
  30. 返回值:1
  31. */
  32. int endsWith(const char* str, const char* substr)
  33. {
  34. //1
  35. //return strstr(str + strlen(str) - strlen(substr), substr) != NULL;
  36. //2
  37. return strcmp(str + strlen(str) - strlen(substr), substr) == 0;
  38. //3
  39. //return strstr(str, substr) == str + strlen(str) - strlen(substr);
  40. }
  41. /*
  42. 功能:从一个字符串前面寻找另一个字符串首次出现的下标
  43. 参数:str目标字符串,substr寻找字符串
  44. 返回:下标位置
  45. 简例:int a= strIndexOf("how are you","are");
  46. 返回值:4
  47. */
  48. int strIndexOf(const char* str, const char* substr)
  49. {
  50. return strstr(str, substr) - str;
  51. }
  52. /*
  53. 功能:在一个字符串str前面开始寻找字符c首次出现的下标
  54. 参数:str目标字符串,c 被寻找的字符
  55. 返回:下标位置
  56. 简例:int a= charIndexOf("how are you",'w');
  57. 返回值:2
  58. */
  59. int charIndexOf(const char* str, char c)
  60. {
  61. //1
  62. /*for (int i = 0; str[i]; i++)
  63. {
  64. if (str[i] == c)
  65. {
  66. return i;
  67. }
  68. }
  69. return -1;*/
  70. char substr[2] = { c };
  71. return strIndexOf(str, substr);
  72. }
  73. /*
  74. 功能:从一个字符串尾部开始寻找另一个字符串首次出现的下标
  75. 参数:str目标字符串,substr寻找字符串
  76. 返回:下标位置
  77. 简例:int a= strLastIndexOf("how do you do","do");
  78. 返回值:11
  79. */
  80. int strLastIndexOf(const char* str, const char* substr)
  81. {
  82. const char* p = str;
  83. const char* q = NULL;
  84. do
  85. {
  86. p = strstr(p, substr);
  87. if (p != NULL)
  88. {
  89. q = p;
  90. p++;
  91. }
  92. } while (p!=NULL);
  93. return q != NULL ? q - str : -1;
  94. }
  95. /*
  96. 功能:在一个字符串str尾部开始寻找字符c首次出现的下标
  97. 参数:str目标字符串,c 被寻找的字符
  98. 返回:下标位置
  99. 简例:int a= charLastIndexOf("how are you",'o');
  100. 返回值:9
  101. */
  102. int charLastIndexOf(const char* str, char c)
  103. {
  104. char t[2] = { c };
  105. return strLastIndexOf(str, t);
  106. }
  107. /*
  108. 功能:判断一个字符串是否空串
  109. 参数:str被检测的字符串
  110. 返回:0 不是 1 是
  111. 简例:int a = isEmpty("");
  112. 返回值 1
  113. */
  114. int isEmpty(const char* str)
  115. {
  116. return *str == '\0';//strlen(str)==0;
  117. }
  118. /*
  119. 功能:去掉字符串中的所有空格
  120. 参数:str 需要去掉空格的字符串
  121. 返回:处理后的str
  122. 简例:
  123. char s[] = " how are you ";
  124. trimAll(s)
  125. 返回值:howareyou
  126. */
  127. char* trimAll(char* str)
  128. {
  129. char* p = str;
  130. int len = 0;//非空格的长度
  131. while (*p)
  132. {
  133. if (*p != ' ')
  134. {
  135. str[len++] = *p;
  136. }
  137. p++;
  138. }
  139. str[len] = '\0';
  140. return str;
  141. }
  142. /*
  143. 功能:只去掉字符串左侧的所有空格
  144. 参数:str: 需要去掉左侧空格的字符串
  145. 返回:处理后的str
  146. 简例:
  147. char s[] = " how are you ";
  148. leftTrim(s)
  149. 返回值:how are you |
  150. */
  151. char* leftTrim(char* str)
  152. {
  153. char* p = str;
  154. while (*p == ' ')
  155. p++;
  156. return strcpy(str, p);
  157. }
  158. /*
  159. 功能:只去掉字符串右侧的所有空格
  160. 参数:str: 需要去掉右侧空格的字符串
  161. 返回:处理后的str
  162. 简例:
  163. char s[] = " how are you ";
  164. rightTrim(s)
  165. 返回值: how are you|
  166. */
  167. char* rightTrim(char* str)
  168. {
  169. char* p = str + strlen(str) - 1;
  170. while (*p == ' ')
  171. p--;
  172. *(p + 1) = '\0';
  173. return str;
  174. }
  175. /*
  176. 功能:把字符串的字母全部转换成大写
  177. 参数:str被变大写的字符串
  178. 返回:处理后的str
  179. 简例:
  180. char s[] = "how are you";
  181. toUpperCase(s);
  182. 返回值: HOW ARE YOU
  183. */
  184. char* toUpperCase(char* str)
  185. {
  186. char* p = str;
  187. while (*p)
  188. {
  189. if (*p >= 'a' && *p <= 'z')
  190. {
  191. *p -= 32;
  192. }
  193. p++;
  194. }
  195. return str;
  196. }
  197. /*
  198. 功能:把字符串的字母全部转换成小写
  199. 参数:str被变小写的字符串
  200. 返回:处理后的str
  201. 简例:
  202. char s[] = "IEEE1394";
  203. toUpperCase(s);
  204. 返回值: ieee1394
  205. */
  206. char* toLowerCase(char* str)
  207. {
  208. for (int i = 0,len= strlen(str); i <len ; i++)
  209. {
  210. if (str[i] >= 'A' && str[i] <= 'Z')
  211. {
  212. str[i] += 32;
  213. }
  214. }
  215. return str;
  216. }
  217. /*
  218. 功能:忽略大小写字母,比较两个字符串的大小
  219. 参数:str1 str2 两个比较的字符串
  220. 返回:1 大于关系 0 等于关系 -1小于关系
  221. 简例:int a=strcmpIgnorecase("Are","are");
  222. 返回值:0
  223. */
  224. int strcmpIgnorecase(const char* str1, const char* str2)
  225. {
  226. //临时的数组
  227. //char tmpStr1[strlen(str1)+1];
  228. char* p_str1 = (char*)malloc(sizeof(char) * (strlen(str1) + 1));
  229. char* p_str2 = (char*)malloc(sizeof(char) * (strlen(str2) + 1));
  230. /*strcpy(p_str1, str1);
  231. strcpy(p_str2, str2);*/
  232. if (p_str1 && p_str2)
  233. {
  234. memcpy(p_str1, str1, strlen(str1) + 1);
  235. memcpy(p_str2, str2, strlen(str2) + 1);
  236. toLowerCase(p_str1);
  237. toLowerCase(p_str2);
  238. int r = strcmp(p_str1, p_str2);
  239. free(p_str1);
  240. free(p_str2);
  241. return r;
  242. }
  243. return 0;
  244. }
  245. /*
  246. 功能:对一个字符串进行翻转
  247. 参数:str被翻转的字符串
  248. 返回:翻转处理后的str
  249. 简例:char s[] ="12345";
  250. 返回值:54321
  251. */
  252. char* reserveStr(char* str)
  253. {
  254. char t;
  255. for (char* p = str, *q = str + strlen(str) - 1; p < q; p++, q--)
  256. {
  257. t = *q;
  258. *q = *p;
  259. *p = t;
  260. }
  261. return str;
  262. }
  263. /*
  264. 功能:把一个s字符串重复连接n次后存放到d字符串
  265. 参数:d最终结果字符串,s被重复的字符串 n 重复的次数
  266. 返回:d最终结果字符串
  267. 简例:char a[50];
  268. repeat(a,"sorry!",3);
  269. 返回值:sorry!sorry!sorry!
  270. */
  271. char* repeat(char* d, const char* s, int n)
  272. {
  273. d[0] = '\0';
  274. for (int i = 0; i < n; i++)
  275. {
  276. strcat(d, s);
  277. }
  278. return d;
  279. }
  280. /*
  281. 功能:把一个长串中的一段字符串复制到另一个字符串。
  282. 参数:s 长串 from从 to到(但不包括) d存放位置
  283. 返回:d字符串的结果
  284. 简例:char d[20];
  285. substr("hello world",2,5,d);
  286. 返回值:llo
  287. */
  288. char* substr(const char* s, int from, int to, char* d)
  289. {
  290. //1
  291. /*int len;
  292. for (len = 0; len < to - from; len++)
  293. {
  294. d[len] = s[from + len];
  295. }
  296. d[len] = '\0';*/
  297. //2
  298. strncpy(d, s + from, to - from);
  299. //memcpy(d, s + from, to - from);
  300. d[to - from] = '\0';
  301. return d;
  302. }
  303. /*
  304. 功能:把sub字符串插入到str的指定下标位置
  305. 参数:str目标字符串 sub被插入的子串 index 插入点下标。
  306. 返回:处理后的str
  307. 简例:
  308. char s[50]="how you";
  309. insert(s,"are ",4);
  310. 返回值:how are you
  311. */
  312. char* insert(char* str, const char* sub, int index)
  313. {
  314. char* p = str + index;
  315. char* temp = (char*)malloc(sizeof(char) * (strlen(p)+1));
  316. if (temp)
  317. {
  318. strcpy(temp, p);
  319. *p = '\0';
  320. strcat(str, sub);
  321. strcat(str, temp);
  322. free(temp);
  323. }
  324. return str;
  325. }
  326. /*
  327. 功能:把字符串中指定下标的字符删除掉
  328. 参数:str目标字符串,index 被删除下标
  329. 返回:处理后的str
  330. 简例:char s[]="how you";
  331. deleteCharAt(s,1);
  332. 返回值:hw you
  333. */
  334. char* deleteCharAt(char* str, int index)
  335. {
  336. return strcpy(str + index, str + index + 1);
  337. }
  338. /*
  339. 功能:把str字符串中的一段字符删除掉
  340. 参数:str被删除的字符串 from删除开始点 to 结束点(但不包括)
  341. 返回:处理后的str
  342. 简例:
  343. char s[]="how you";
  344. deleteSubstr(s,0,4);
  345. 返回值:you
  346. */
  347. char* deleteSubstr(char* str, int from, int to)
  348. {
  349. return strcpy(str + from, str + to);
  350. }
  351. /*
  352. 功能:把字符串str的一小段字符替换成另一个字符串sub
  353. 参数:str目标字符串 from起始点,to结束点(但不包括) sub替换的内容
  354. 返回:处理后的str
  355. 简例:
  356. char s[50]="how is you";
  357. replace(s,4,6,"are");
  358. 返回值:how are you
  359. */
  360. char* replace(char* str, int from, int to, const char* sub)
  361. {
  362. deleteSubstr(str, from, to);
  363. return insert(str, sub, from);
  364. }
  365. /*
  366. 功能:把字符串str中的某些部分替换成另外的字符串
  367. 参数:str目标字符串 oldsub原来的内容 newsub 新的内容
  368. 返回:处理后的str
  369. 简例:
  370. char s[50]="how did you did";
  371. replaceAll(s,"did","do");
  372. 返回值:how do you do
  373. */
  374. char* replaceAll(char* str, const char* oldsub, const char* newsub)
  375. {
  376. char* p = str;
  377. int from, to;
  378. do
  379. {
  380. p = strstr(p, oldsub);
  381. if (p)
  382. {
  383. from = p - str;
  384. to = from + strlen(oldsub);
  385. replace(str, from, to, newsub);
  386. }
  387. } while (p != NULL);
  388. return str;
  389. }

 提取头文件及源文件

第一步:先用文件资源管理器打开文件夹:

第二步:将头文件及源代码复制到桌面:

封装静态库

 第一步:创建一个静态库项目:

 

 确定好项目名称和解决方案名称还有文件位置之后创建即可

 第二步:将头文件与源代码添加到项目文件中:

 将头文件添加到头文件,源代码添加到源文件:

第三步:处理代码:

 在源代码的第一句加上#include "pch.h" (一定要是第一句)

 在pch.h头文件的第一句关闭安全警告

 第四步:生成:

 第五步:找到库:

打开解决方案所在文件夹

在Debug中找到库

 

 可以将库先复制到桌面上

第六步:使用:

在解决方案中创建一个空项目

 命名为测试string组件

 将库与头文件粘贴到项目所在文件夹中

 找到库的相对路径

 写入头文件并加载组件

测试组件

  1. char str[] = "how are you hahaha";
  2. printf("hello %s\n",toUpperCase(str));

 

 封装动态链接库

第一步:添加一个动态链接库项目:

 命名为DllStringpro并创建

 第二步:将头文件和源文件添加到项目中:

 在头文件中加入头文件,源文件中加入源代码

 第三步:处理代码:

在源代码的第一句加上#include "pch.h"

 在pch.h头文件中关闭安全警告

 在string_pro.h头文件中的每个功能函数前面加上_declspec(dllexport)

 第四步:生成:

 第五步:找到库:

在解决方案文件中的Debug文件中找到 

可以先拷贝到桌面

 

 .h是开发用的,.lib是引导调用的,.dll是真正的程序

第六步:使用:

将.lib文件加入到测试项目中,可以观察到动态链接库的lib比静态库的lib要小很多

由于头文件已经在测试静态库是添加过了,就不用二次添加了

 加载动态组件:

发现现在程序可以执行

原因是在解决方案中有dll,然后exe通过lib来调用dll 

 dll是在项目外的,但是一定要跟exe在同一路径

静态库和动态链接库的区别

 静态库需要放到项目中,他会跟随项目一同打包为exe文件,所以如果exe用到的组件较多,那么他的文件体积会很大,并且每个程序的代码区都会有一份静态库,会造成空间浪费。他还不易更新,在更新时要将所有程序都更新一遍,他的优点就是移植方便。动态链接库是独立在exe外边的,它属于资源共享,谁想用谁就调用它即可,并且升级也很简单,只要更新自己就行,因为不需要打包在exe文件内,所以文件体积也会较小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/43363
推荐阅读
  • 网络故障管理是以最快的方式查找、隔离和排除网络故障的过程。故障管理是网络管理的重要组成部分,它通过快速解决故障来最大限度地减少停机时间并防止设备故障,从而确保最佳的网络可用性并防止业务损失。自动化网络故障管理故障管理是网络管理的组成部分,涉... [详细]

  • 【MySQL】打开科技创新的第一生产力
    本篇主要讲是什么是SQL以SQL用法及分类,以及如何使用数据库,通过DDL创建和操作数据库表。【MySQL】打开科技创新第一生产力... [详细]

  • 效果图直接在需要的页面引用该组件就行