Linux系统编程 31 动态库加载错误原因及解决方式2
标准库的时候,就没有修改LD_LIBRARY_PATH,
就可以直接使用。-》动态链接器会去标准c库中
去找想要的动态库。
1.所以我们可以把我们建立的动态库放在标准c库的位置
cp libmymath.so /lib
cp: cannot create regular file ‘/lib/libmymath.so’: Permission denied
$sudo cp libmymath.so /lib
[sudo] password for ubuntu:
2.屏蔽原来修改
$vi ~/.bashrc
#export LD_LIBRARY_PATH=./
#export LD_LIBRARY_PATH=./lib
要先使得修改起作用
$source ~/.bashrc
3.执行可执行文件
$cd code
$cd test
$ls
dynaticlib file file2 hello hello.c inc lib staticlib
$cd dynaticlib/
$ls
inc resource test.c testdy2.out testdy.out
$./testdy2.out
4+6=10
4-6=-2
4/6=0
在linux中, ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。
$ls
inc resource test.c testdy2.out testdy.out
$ldd testdy2.out
linux-vdso.so.1 => (0x00007ffe3efa0000)
libmymath.so => /lib/libmymath.so (0x00007f82037f4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f820342b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f82039f6000)
这种不推荐,因为使用了超级权限
了解就好。
到现在介绍了三种
1.临时生效
export LD_LIBRARY_PATH=***
2.永久生效
修改 ~/.bashrc文件
3.将动态库文件放入标准库下
还有第四种方法
4.配置文件法
在标准库中删除自己的动态库文件
$sudo rm /lib/mymath.so
rm: cannot remove ‘/lib/mymath.so’: No such file or directory
$sudo rm /lib/libmymath.so
将lib文件夹放回dynaticlib中去
$ls
inc resource test.c testdy2.out testdy.out
$mv ../lib ./
$ls
inc lib resource test.c testdy2.out testdy.out
1)打开配置文件
$sudo vi /etc/ld.so.conf
/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径
2)输入动态库的绝对路径
/home/ubuntu/code/test/dynaticlib/lib
3)保存退出
4)将配置文件生效
sudo ldconfig -v
$sudo ldconfig -v
/sbin/ldconfig.real: Can't stat /lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Can't stat /usr/lib/i686-linux-gnu: No such file or directory
//很多内容省略
-v 是显示给用户看的
5)ldd 相关out,查看依赖关系
$ls
inc lib resource test.c testdy2.out testdy.out
$ldd testdy2.out
linux-vdso.so.1 => (0x00007ffe86395000)
libmymath.so => ./lib/libmymath.so (0x00007fcb0bfb0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0bbe7000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb0c1b2000)
6)执行可执行文件
$./testdy2.out
4+6=10
4-6=-2
4/6=0
动态库的制作方法要求一定要会。