目录

一.定义

1.动态库和静态库

2.动态链接和静态链接

二.制作第三方库

1.生成静态库

1.1制作静态库

1.2使用静态库

2.生成动态库

2.1 制作动态库

2.2 使用静态库

三.补充makefile的发布


一.定义

1.动态库和静态库

一个库主要包含的是一批头文件和一个或者多个源文件。头文件是函数的声明,说明有什么方法可以使用。源文件,其实是一些二进制文件(目标文件.o),是具体函数的实现。

  • 动态库:在linux下是后缀为.so文件,在windows下是后缀为.dll文件。多个程序可以共享使用动态库代码。
  • 静态库:在Linux下是后缀为.a的文件,在windows下是后缀为.lib的文件。

2.动态链接和静态链接

  • 动态链接:在可执行程序运行前,操作系统将使用到动态库机器码从硬盘加载到内存中。

  • 静态链接:可执行程序编译链接时,将代码使用到的静态库的代码拷贝到可执行程序中。

静态链接和动态链接的优缺点:

静态链接:可执行程序文件体积大,但是不依赖库,可移植性强。

动态链接:库执行程序文件体积小,但是依赖库,如果库被删除,该程序也就不可以使用了。

gcc一般默认生成的二进制程序是动态链接的,如果想实现静态链接,在最后加上-static

 注意:动静态链接并不是将库函数说有的代码都链接,而是将使用到的代码链接。

二.制作第三方库

由上我们知道,一个库主要包含这个多个头文件一个或者多个库文件(二进制的.o文件打包的为念)。

所以,要制作一个第三方库,我们得包含头文件和库文件(将源文件打包成后缀为.a或者.so的文件)。

1.生成静态库

1.1制作静态库

写一个静态库需要头文件和能生成目标文件的文件。

将下面两个文件写成静态库

  • 生成目标文件(二进制文件),打包目标,生成库文件。

打包命令:ar -rc 库文件名 目标文件名

ar是gnu的归档工具,rc(replace and create)

ar -tv 库文件名  可以查看库文件使用的目标文件。

t:列出静态库中的文件

v:verbos  详细信息

上面就制作好了第三方动态库:包含头文件add.h,sub.h和libmymath.a。

1.2使用静态库

但是在编译时要加上库库路径,库名和头文件的路径。

  • -I(大写i):指定头文件路径
  • -L:执行库路径
  • -l(小写L):指定库名,库名为去掉库文件前的lib和后缀就是库名。

完整演示,我将我写的库放在一个单独的目录下。

为什么编译的时候要加路径:

系统中有查找静态库文件有环境变量,(LIBRARY_PATH),系统会在这个环境变量里找库文件。但是我们编写的库函数没有在这个环境变量中,所以要加路径。

如果想不带路径,可以将我写的库函数放到环境变量的文件中(污染系统库文件)。或者将路径加到环境变量中。

总结:一个库时要包含头文件和库文件的。

编写一个静态库:

  • 将源文件生成目标文件
  • 将所有目标文件打包成库文件。ar -rc 库文件名 目标文件

库要包含头文件打包的库文件。头文件可以直接获得。

使用静态库:

  • 编译的时候加上路径。

2.生成动态库

2.1 制作动态库

生成动态库和静态库的实质是一样的。只是方法不同。

  1. 生成目标文件
  2. 打包成动态库文件
  3. 编译时加路径

上面就制作好了第三方库,包含头文件add.h,sub.h和库文件libmymath.so。

2.2 使用静态库

在使用时也需要加路径。

  • -I(大写i):指定头文件路径
  • -L:执行库路径
  • -l(小写L):指定库名,库名为去掉库文件前的lib和后缀就是库名。

但是当我make,在执行程序时

在执行就能得到结果:

总结:

编写一个动态库:

  • 获得源文件和头文件
  • 将源文件生成目标文件,gcc -fPIC -o
  • 目标文件生成静态库,gcc -share -o *.so  *.o

动态库:就是所有头文件和库文件

使用动态库:

  • 编译时要让编译器知道库文件路径,头文件路径和库名
  • 让系统知道库文件路径。添加环境变量。将库文件绝对路径加到LD_LIBRARY_PATH中。

三.补充makefile的发布

编写一个第三方库(动态库和静态库)相关推荐

  1. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  3. 【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)

    动静态库的基本原理 认识动静态库 动静态库的概念 静态库的打包与使用 静态库的打包 静态库的使用 动态库的打包与使用 动态库的打包 动态库的使用 动静态库的基本原理 动静态库的本质就是可执行程序的&q ...

  4. ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库

    在iOS的开发过程中,我们常常用到第三方的库.尤其是QQ.百度地图.广告等. 那么,如何制作自己的库文件呢? 如果,将自己写的功能类编译成库文件,分发给其他人来使用呢? 静态库的优点 编译静态库的好处 ...

  5. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  6. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  7. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTime ...

  8. 静态编译,动态编译,静态库,动态库的区别

    from :http://blog.csdn.net/ithzhang/article/details/20160009 周五晚,小雨,少见的未加班.无聊,遂准备写一篇博客,介绍一下C和C++运行库, ...

  9. linux编译c++ 静态库,C/C++ 条件编译静态库

    ==>windows 下方法: 1.方法一:VS工程中中直接添加 1.1在VS的属性->常规->附加库目录,添上文件夹的路径:例如:lib/x64: 1.2输入的附加依赖项,添加上库 ...

  10. aix 的c库为什么都是静态库_Linux静态库生成指南

    Linux上的静态库,其实是目标文件的归档文件. 在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生成静态库. 配合静态库,写一 ...

最新文章

  1. mof格式的文件怎么打开?用什么工具?
  2. MDM9x35MDM9x35启动流程简介
  3. 小明分享|ESP8266设置STA模式ping包测试
  4. 容器可以作为全局变量吗_四季青是风水树吗?哪些可以作为风水树?
  5. 【转】!!c#文件系统操作类继承关系图
  6. java 1的阶乘之和_1-20的阶乘之和(java)
  7. 准确率(Accuracy) | 查准率(Precision) | 查全率(Recall)
  8. 今天开始学opnet14.5
  9. 将MongoDB.NET驱动程序与.NET Core WebAPI一起使用
  10. 简单SQL的增、删、改、查语句
  11. linux总线控制设备,在platform总线上注册设备并载入驱动控制led灯
  12. Node.js 创建第一个应用
  13. FFmpeg的下载及其简单使用
  14. GET、POST、PUT、DELETE等用法
  15. KumiaoQQ机器人框架源码
  16. 本地计算机无法启动dhcp服务,提示Windows无法启动DHCP Client服务如何解决
  17. MyBatis之one2one与one2many
  18. AMD无悔卖掉晶圆厂:代工好处多 产能不再是问题
  19. android--新闻阅读器实现源码
  20. 如何做一个FPGA工程师

热门文章

  1. Shottr 免费好用的Mac 截屏软件
  2. 在ubuntu 20.04中使用Theano
  3. Struts1 面试题目总结
  4. 56个民族HTML代码
  5. matlab求内切圆,MATLAB求图形的最大内切圆代码
  6. 计算机配色在纺织中的应用,计算机配色在印染行业的应用
  7. SSM毕设项目国有资产管理系统3c938(java+VUE+Mybatis+Maven+Mysql)
  8. VOCALOID笔记
  9. oracle独占锁表禁止查询,oracle 锁表查询及解决、表字段查询
  10. 组态王bitset用法_组态王使用问题解答8