目录

一,必要的说明

1.准备测试程序

2.静态库与动态库的简要说明

3.静态库与动态库区别

二. 动态库

1.生成动态链接库

 2.如何使用动态链接库

三,解决应用程序无法链接到动态库的问题

1.为什么加载/找不到动态链接库

 2.解决方案

3.怎么设置 

最后别忘了执行以下命令生效(否则不会生效,除非重启)


一,必要的说明

1.准备测试程序

测试程序可以再我的上一篇博客中(Linux 环境下的静态库生成与使用)获取。当然测试程序比较简单,大家可以自行编写。

2.静态库与动态库的简要说明

这里我们只讲 Linux 环境下的静态库与动态库的生成与使用, Windows直接用VS直接就能生成。

在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

当我们拿到了库文件(动态库、静态库)之后要想使用还必须有这些库中提供的 API 函数的声明,也就是头文件,把这些都添加到项目中,就可以快乐的写代码了。

3.静态库与动态库区别

1.静态链接库:程序编译时被链接到目标代码。
2.动态链接库:程序运行时才会链接到目标代码。

知道了静态库与动态库区别,它们的优缺点就不言而喻了。

二. 动态库

动态链接库是程序运行时加载的库,当动态链接库正确部署之后,
运行的多个程序可以使用同一个加载到内存中的动态库,因此在 Linux 中动态链接库也可称之为共享库。

在 Linux 中动态库以 lib 作为前缀,以.so 作为后缀,中间是库的名字自己指定即可,即: libxxx.so
在 Windows 中动态库一般以 lib 作为前缀,以 dll 作为后缀,中间是库的名字需要自己指定,即: libxxx.dll

1.生成动态链接库

生成动态链接库是直接使用 gcc 命令并且需要添加 -fPIC(-fpic) 以及 -shared 参数。

-fPIC 或 -fpic 参数的作用是使得 gcc 生成的代码是与位置无关的,也就是使用相对位置。
-shared参数的作用是告诉编译器生成一个动态链接库。

 下图是测试代码结构


# -I :重新指定要搜索的文件目录。
gcc -c -fpic add.c sub.c muli.c div.c -I ./include/

 执行上面语句后会生成相对位置的 .o文件

 执行下面的指令,生成动态链接库

gcc -shared *.o -o libCalc.so

 

 2.如何使用动态链接库

1. 动态库的使用
得到了一个可用的动态库之后,将其与相应的头文件放到一个目录中(就相当于发布了),
然后根据得到的头文件编写测试代码,对动态库中的函数进行调用。

这里我把生成的动态库和相应的头文件放到temp文件夹中进行测试。

 

 2.这里我们会用到gcc的两个参数
-l :在程序编译的时候,指定使用的库。(静态库的名字一定要掐头去尾。如:libCalc.so变为Calc)
-L :在程序编译的时候,指定使用的库的路径。

gcc main.c -o calc -L ./ -l Calc

 

 如果各位码友都顺利的走到这一步,并且测试程序正常跑起来了,那么恭喜你完成了。

如果出现:./calc: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory的报错,不要慌,下面我们就来分析问题,并给出解决方案。

三,解决应用程序无法链接到动态库的问题

1.为什么加载/找不到动态链接库

在可执行程序calc中只包含了测试程序和头文件,而没有包含动态链接库,因为动态链接库本身是可以共享的。

 2.解决方案

将动态链接库路径添加到环境变量LD_LIBRARY_PATH中

这里有必要解释一下,很多小白都认为环境变量都是PATH,其实不然

PATH:用于设置可执行程序的查找路径

LD_LIBRARY_PATH:用于设置动态库的查找路径

3.怎么设置 

其实跟设置环境变量一样,分为设置当前用户环境变量和系统环境变量,前者只对当前用户起作用,后者对所有用户都起作用。

 1.设置当前用户的环境变量LD_LIBRARY_PATH,只对当前用户有效

vim ~/.profile  或者 vim ~/.bashrc 都可以。

export LD_LIBRARY_PATH=/home/shaofeng/桌面/c++/2.动态库/temp:$LD_LIBRARY_PATH

 2.设置系统环境变量LD_LIBRARY_PATH,对所有用户都有效。

sudo vim /etc/profile   或者sudo vim /etc/environment 都可以。

export LD_LIBRARY_PATH=/home/shaofeng/桌面/c++/2.动态库/temp:$LD_LIBRARY_PATH

最后别忘了执行以下命令生效(否则不会生效,除非重启)

当前用户情况下:source ~/.profile 或者 source ~/.bashrc

 对于系统:source /etc/profile 或者 source /etc/environment

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐