当前位置: 首页 > article >正文

C/C++静态库的理解和制作

1.什么是库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是⼀种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:

静态库.a[linux] .lib[windows]
动态库.so[linux] .dll[windows]

2.静态库

1.静态库:程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。
2.一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,二我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采用同名静态库。我们也可以使用gcc的 -static 强制转换车工链接静态库。

2.1静态库的生成和使用

静态库生成是个什么逻辑呢?
首先我们需要先把需要制作成库的.c文件都生成.o文件,这样在最后直接进行链接即可生成可执行程序。
在这里插入图片描述
这里是我们文件夹中的三个文件,首先mystr.h就是声明fun方法(这里我们的功能就是计算字符串的长度)然而我们在mystr.c 中实现的fun函数的功能,在test测试函数中调用。
那么我们怎么实现让别人不知道我们的代码,但是可以使用我们代码的功能呢?
首先我们先使用gcc -c mystr.c这个命令,将我们目录中我们需要制作成库的.c文件全都处理成汇编后的二进制.o文件。
这里需要哪些文件-c后面就跟哪些文件(可以跟多个)
在这里插入图片描述
有了.o文件这个时候我们使用一个叫做ar的命令:

ar -rc libmyc.a mystr.o

ar是一个归档工具 -rc(表示replace和create)
在这里插入图片描述
这里就生成了我们的静态库(libmyc.a)。
这里我们还需要将我们的测试文件编译成.o形式
在这里插入图片描述
最后一步就是使用gcc进行编译,用到的命令是:

gcc -o test test.o -L . -lmyc
-L表明除了在系统库目录下找库,还要再当前目录下寻找
-l表明指定我们的库myc ,这里全称是libmyc.a,因为这是一个库的格式,这里使用时直接采用lib后和.a前这中间的名称即可。

在这里插入图片描述
当然我们怎么才能让别人看不到我们的代码而使用呢?
这里我们来新创建一个目录叫做Test,用来模拟其他用户。
在这里插入图片描述
然后我们打开这个libmyc.a这个库文件看看是什么呢
在这里插入图片描述
没错这就是经过汇编后生成的二进制文件这里是无法看到我们的源代码的,那么我们来看看能不能使用吧:
在这里插入图片描述
在这个新建的目录下我们发现也是可以直接使用库进行链接的,而且最终的答案跟我们test.c中的字符串长度相同。


http://www.kler.cn/a/599845.html

相关文章:

  • SpringBoot集成Couchbase开发与实践
  • 后端——AOP异步日志
  • element-plus中Cascader级联选择器组件的使用
  • 【STM32】第一个工程的创建
  • Python+Requests+Pytest+YAML+Allure接口自动化框架
  • React Router使用方法
  • 华为OD机试2025A卷七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
  • react中useRef和useMemo和useCallback
  • OSS Browser2.0安装使用(阿里云对象存储OSS 图形化界面工具2.0版本)
  • <C#> 详细介绍.net 三种依赖注入:AddTransient、AddScoped、AddSingleton 的区别
  • HarmonyOS NEXT(十) :系统集成与调试
  • 【React】List使用QueueAnim动画效果不生效——QueueAnim与函数组件兼容性问题
  • 【Java】Springboot集成itextpdf制作pdf(内附pdf添加表格、背景图、水印,条形码、二维码,页码等功能)
  • WebRTC协议全面教程:原理、应用与优化指南
  • HBuilderX开发微信小程序常见问题及入门教程下载
  • Qt的内存管理机制
  • 2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
  • C语言基础08
  • 新版本Springboot的lombok导入依赖出现问题的解决办法
  • Cursor+Claude-3.5生成Android app