编写一个第三方库(动态库和静态库)

目录

一.定义

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的发布

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值