回顾上文:
(122条消息) Linux使用第三方库链接的使用方式——静态式_橙予清的zzz~的博客-CSDN博客https://blog.csdn.net/weixin_69283129/article/details/131414804?spm=1001.2014.3001.5502 上篇文章中,我讲到了关于链接第三方库作为静态库的使用方式,其中有两种:一种是下载公司B提供的安装包到自己的目录中进行编译链接,但缺点是步骤过于复杂,需要告知头文件的地址、库文件的地址和名称;第二种比较方便,但需要将安装包的头库文件拷贝到gcc指定的路径下才行,方便gcc编译器寻找,但是不建议用这种方式,因为不要随意的去修改系统路径下的内容,可能会导致很多问题的出现。
而接下来,我将带大家实现用第三方库做动态库的形式去链接生成可执行文件!
第三方库被作为动态库的使用:
案例1:
我仍是用两个窗口分别模拟客户端(客户)和服务端(公司B)去实现:
1、客户端视角,该目录下只有main.c文件,他正在等待服务端提供函数实现等文件的到来。
2.服务端视角:该目录下已经写好了客户需要的Add.c、Sub.c、Add.h、Sub.h文件
插播一条指令:
-fpic是GCC的一个编译选项,全称是position-independent code,即生成位置无关代码。该选项会使得编译器生成不依赖于特定内存地址的可执行文件,使得程序可以在不同的内存位置上执行。
-fpic选项是生成位置无关代码和动态链接库的必要条件。因为在动态链接过程中,代码段会被加载到不同的内存地址,而位置无关代码就是为此而设计的,它可以被加载到任意的内存地址上执行,从而增加了代码的可移植性。通过本文的阐述,你已经了解了-fpic选项的含义、应用场景及生成代码的常规流程。如果你希望生成的动态链接库在不同平台上都能正常运行,就必须使用-fpic选项进行编译。
3.将.c文件全都生成为.o目标文件:
4、创建一个动态链接库,需要使用 GCC 的
-shared
选项。使用file指令查看该动态链接库,可以发现dynamically linked动态链接,表明生成动态库成功。
5、使用makefile指令创建多项指令,并将动态库文件和头文件打包到一个目录中:
6、将打包好的文件压缩成压缩包:
7.客户端视角:开始解压服务端提供的安装包:
8、开始链接这些库文件和头文件并生成可执行文件:
错误解析:我们发现这次和上篇文章中链接静态库出现的情况一模一样,都是gcc编译器不认识第三方提供的头文件、库文件!
所以我们需要为gcc编译器特别指明这些库文件、头文件的路径!
解决方法:
于是可执行文件被生成了!
:在后面加上:-L 库文件的路径
在后面加上:-l(大写i) 库文件的名称
在后面加上:-l(小写L) 库文件的
-l链接方式需要注意:得去除动态库文件libmy_math.so的前缀lib和后缀.so
9、在运行的可执行文件的过程中,发现无法运行 !
为什么?连可执行文件都无法运行了?因为运行的时候是由操作系统去执行,已经和gcc没有关系了,gcc的任务已经完成了。你只告诉了gcc编译器第三方动态库的库文件名称、路径,以及头文件路径。但是操作系统是不知道的,于是产生了错误。
解决方法:采用export指令增添环境变量
将第三方动态库文件mylib的绝对路径添加到环境变量中即可。
运行该可执行文件,成功运行!
如下图便是使用export指令添加库文件的绝对路径到环境变量的结果显示:
还有一种能运行可执行文件的方式:利用软链接去链接动态库libmy_math.so文件
ln -s指令:产生对某个文件进行软链接
使用ln -s对该动态库进行链接后,操作系统就相当于认识了该动态库,便可以直接运行可执行文件了。