动态库与静态库专栏

本文章主要讲解自己制作库

了解什么是库

在计算机编程中,一个库(Library),也被称为软件库或者程序库,是一个预编译好的可重用代码集合,它包含了一组函数、类、变量或其他可执行代码,以供其他软件程序使用。通常,库的目的是为了方便程序员在开发过程中重复利用代码,减少重复工作,提高代码的复用性和可维护性。

库可以分为系统库和第三方库两种类型。系统库是操作系统自带的库,而第三方库则是由开发者自己编写或由其他第三方开发者编写的库。通常,第三方库被广泛用于不同编程语言和开发领域,例如,图形处理、网络通信、数据处理和安全加密等等。

库的分类

静态库和动态库,本质区别是代码被载入时刻不同。

1) 静态库在程序编译时会被连接到目标代码中。

优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快

缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

2) 动态库是在程序运行时才被载入代码中。

优点:程序在执行时加载动态库,代码体积小;

程序升级更简单;

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行时还需要动态库的存在,移植性较差

LINUX系统下库的制作

静态库制作

编写代码文件:首先,需要编写代码文件,以便将其打包到库中。请确保代码已经通过了编译并且没有任何错误或警告。

将代码编译成目标文件:使用编译器将代码编译成目标文件。例如,对于C语言代码,可以使用gcc编译器来编译代码,并将其保存为.o文件。例如,假设一个名为example.c的源代码文件,可以使用以下命令将其编译为目标文件example.o:

gcc -c example.c -o example.o


创建静态库:使用ar命令创建静态库。ar是一个用于创建静态库的Unix命令行实用程序。需要使用ar命令将所有目标文件打包到一个静态库文件中。例如,如果要将两个目标文件example1.o和example2.o打包到名为libexample.a的静态库中,则可以使用以下命令:

ar rcs libexample.a example1.o example2.o

其中,'r'选项表示将文件添加到库中,'c'选项表示创建库文件(如果不存在),'s'选项表示创建索引。

使用静态库
现在可以使用静态库中的函数了。只需将库文件与的源代码链接即可。例如,如果您要使用libexample.a库中的函数来编译您的应用程序myapp.c,则可以使用以下命令:

gcc -o myapp myapp.c -L. -lexample

其中,'-L.'选项表示在当前目录中查找库文件,'-lexample'选项表示链接libexample.a库。

动态库的制作

写源代码

编写动态库的源代码。通常情况下,动态库的源代码包含函数和变量的定义和实现。

编译源代码:使用合适的编译器将源代码编译成目标文件(.o 文件)。

gcc -fPIC  -c hello.c  -o hello.o        //   -fPIC 创建与地址无关的编译程序

创建动态库:使用链接器将目标文件链接成动态库文件(.so 文件)。

gcc  -shared  -o  libmyhello.so  hello.o

安装动态库:将动态库文件安装到操作系统的动态库搜索路径中。这通常可以通过将 .so 文件复制到 /usr/lib 或者 /usr/local/lib 等目录中来完成。

测试动态库:编写测试程序来测试动态库是否正常工作。

gcc main.c  -L. -lmyhello

更新动态库:如果需要更新动态库,可以按照以上步骤重新编译、链接和安装动态库文件。

动态库注意事项

编译运行时报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件

解决方法(有三种):

(1)把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(终端关闭,环境变量就没在了)

(3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

添加动态库存在的路径,如:

/home/hq/teach/22092/day3/dynamic

编译注意事项

gcc 编译时需要添加选项

-L  路径:指定库的路径

-l   库名:(小写的L)指定库名

-I   路径:(大写的i)指定头文件的路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值