动态库的制作和使用

文章详细描述了在Linux环境下,如何使用gcc编译c语言文件生成动态库(libcalc.so),以及当运行可执行程序时遇到找不到动态库的问题,解决方案包括设置环境变量LD_LIBRARY_PATH,编辑.bashrc文件进行用户级别配置,编辑/etc/profile进行系统级别配置,以及更新/etc/ld.so.conf文件和ldconfig命令。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1.首先用gcc将src文件下的c语言文件生成为编译、汇编指定的源文件,也就是.o文件(注意,如果头文件没有和c文件在一起,需要一起传入头文件的位置).

nowcoder@nowcoder:~/linux/lession06/calc$ gcc -c -fpic add.c div.c mult.c sub.c

2.使用gcc(archive)工具将.o文件打包,注意生成的文件名是lib后面的calc

nowcoder@nowcoder:~/linux/lession06/calc$ gcc -shared add.o mult.o sub.o div.o -o libcalc.so

3.将打包后的文件从calc文件里复制到library的lib下面(这里也可以不移动,移动的话后面调用需要写该文件的位置)

nowcoder@nowcoder:~/linux/lession06/calc$ cp libcalc.so ../library/lib/

在这里插入图片描述
4.main.c函数调用生成的动态库文件.

nowcoder@nowcoder:~/linux/lession05/library$ gcc main.c -o app -I ./include/ -L ./lib/ -l suanshu

-I ./include/ 找到main.c对应头文件的位置
-L ./lib/ 找到要调用的静态库文件的位置
-l suanshu 指定要调用的库(注意要使用名字,生成的时候是libsuanshu.a,调用的时候是suanshu)

这种调用方法和调用静态库的方式是一样的,但是程序会报错

nowcoder@nowcoder:~/linux/lession06/library$   ./main
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

我们通过 ldd (list dynamic dependencies)命令检查动态库依赖关系,如下图,我们会发现main依赖的动态库libcalc.so找不到,说明我们在运行生成的可执行程序main时并未找到动态库。

在这里插入图片描述
在这里插入图片描述
5.针对找不到动态库的问题,我们可以配置环境变量LD_LIBRARY_PATH 有以下几种配置方法:
:将动态库文件的路径配置到环境变量LD_LIBRARY_PATH里($LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib 表示LD_LIBRARY_PATH原来的文件内容加上新的内容)

nowcoder@nowcoder:~/linux/lession06/library$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib 

查看LD_LIBRARY_PATH文件内容,发现已经将我们的动态库文件路径配置进去了
在这里插入图片描述
再次查看main文件依赖,可以看出动态库的路径可以找到了,就可以正常的执行程序
在这里插入图片描述在这里插入图片描述
但是这种方法在我们关闭XShell以后他的配置就会消失,只是暂时的,所以如果需要永久性的配置,需要用后面两种方法
.用户级别的配置
我们首先查看hone目录下有个.bashrc文件
在这里插入图片描述
我们在.bashrc文件里面最后一行添加我们方法一中的配置方法,加入如下代码

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib

接着我们将.bashrc文件执行一下,以下两种方法都可

nowcoder@nowcoder:~$ . .bashrc
nowcoder@nowcoder:~$ source .bashrc

然后我们就可以正常的执行我们得可执行文件main

在这里插入图片描述
系统级别的配置:
首先进入/etc/profile文件里面,因为需要root权限,所以加了一个sudo

nowcoder@nowcoder:~/linux/lession06/library$ sudo vim /etc/profile

在/etc/profile文件里面做和方法一同样的配置

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lession06/library/lib

接着我们将.bashrc文件执行一下,以下两种方法都可

nowcoder@nowcoder:~$ . /etc/profile
nowcoder@nowcoder:~$ source /etc/profile

然后我们就可以正常的执行我们的可执行文件main
在这里插入图片描述
6.针对找不到动态库的问题,我们还可以配置/etc/ld.so.cache文件列表:
因为/etc/ld.so.cache文件里面全部是二进制代码,所以不能直接在里面配置,我们用如下的方法

nowcoder@nowcoder:~$ sudo vim /etc/ld.so.conf

进入该文件以后,我们将我们的动态库文件路径输入进去,动态库文件路径如下:

/home/nowcoder/linux/lession06/library/lib

保存以后,执行一下

nowcoder@nowcoder:~$ sudo ldconfig

然后我们就可以正常的执行我们得可执行文件main

在这里插入图片描述7.针对找不到动态库的问题,我们还可以将我们的动态库文件放入/lib/或者/usr/lib目录中,但是一般不推荐这种方法,因为前两个目录里面有很多的文件,如果里面的文件和我们的动态库文件名字一样,很可能会发生错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值