在ubuntu下代码编译通过的情况下,经常出现运行时加载动态库出错的情况。这些问题很琐碎,不具备任何技术含量,纯属耽误时间,这也是linux系统的通病,花里胡哨,故弄玄虚。
为了减少初学者在这种无意义的事情上浪费大量的时间,本文对这个问题提供一点解决方案,这些方案都是在Ubuntu18.04上测试过的,希望对需要者有所帮助。
这里使用的是最小化的代码,主程序是mytest,其运行时需要调用libtest.so, 成功调用后输出信息:Hello Shared Library!
否则会抱怨找不到动态库。
本文的工作目录为/home/eric/dlltest
error while loading shared libraries:libtest.so: cannot open shared object file: No such file or directory
这就对了,符合本文的预期,libtest.so已经被移除了,所以会报错。
下面将libtest.so拷贝回来。
有:
可见这样mytest就找到了动态库libtest.so。
再次将libtest.so移动到/home/eric/lib/下面,有:
这时候,
dlltest下面只有mytest执行文件,继续测试有:
错误继续出现,这样就对了。下面想办法能够让mytest程序能够找到动态库libtest.so。
第一种方法:
使用
可以看到,动态库找到了,然而这种方法关闭了窗口之后就没效果了。
重启命令窗口后问题继续出现,
这时候需要
第二种方法,修改.bashrc文件
进入到/home/eric下(eric是本文在ubuntu上的用户名)
在.bashrc文件末尾加入:
export LD_LIBRARY_PATH=/home/eric/lib:$LD_LIBRARY_PATH
也就是上图第121行,保存退出后,运行source .bashrc
可见/home/eric/lib 已经在库路径里面了。
这是进入到/home/eric/dlltest目录:
可见,这次动态库路径是对的,为了保险起见,关闭窗口,重新打开,有:
可见还是可以找到的。
下面将export LD_LIBRARY_PATH=/home/eric/lib:$LD_LIBRARY_PATH 从/home/eric/.bashrc文件中注释掉。
可见还是找的到动态库,这不科学!
查看库路径果然/home/eric/lib还在,这时候需要运行下source .bashrc,可以看到库变量改变了。
不过虽然是库变量改变了,但是还是系统找得到动态库libtest.so,只好关闭窗口重启了:
这次是真的找不到了。
linux系统下就是经常发生这种非常微妙的小插曲,当你以为搞定了,实际上却是错误的结论,好在本文用了一个最小出错模型,有大量的时间可以耗下去,如果在生产环境,这种代价是承受不起的。
这样第二种方法也测试成功了。下面介绍第三种方法。
第三种方法,修改/etc/ld.so.conf文件
本文的/etc/ld.so.conf内容为:
加上路径/home/eric/lib/
有:
修改后保存。
继续测试mytest,可见还是找不到库。
这是需要运行sudo ldconfig:
本文运行的当前目录是/home/eric/dlltest
可见sudo ldconfig命令不挑当前目录。
为了保险起见,关闭窗口,重新启动:
可见还是可以找得到的,说明此方法可行。
继续修改etc/ld.so.conf文件,删除路径/home/eric/lib/,并运行sudo ldconfig等有:
说明又找不到了,好的,符合预期,重启窗口试一下,虽然不大有可能出现反常,但是怕了,必须验证!
还是没找到,说明的确第三种方法是起作用的。
下面介绍第四种方法:
第四种:在/etc/ld.so.conf.d/目录下添加youtest.conf文件
文件内容为/home/eric/lib/
也就是动态库libtest.so的所在路径。
可以看到youtest.conf文件产生了。
这是运行mytest测试一下:
没找到,这符合预期,还没有使用sudo ldconfig命令
可见,这次文件youtest.conf起作用了,文件名youtest.conf是为了避嫌,也就是这个可以和mytest不一样,当然后缀名是需要.conf就行。
再次重启窗口,
可见还是可以找得到动态库。
说明这种方法也是成功的。
综上所述,本文介绍了找动态库的四种方法,也许方法可能会有千千万万种,但是本文不感兴趣,有了这几种方法后,初学者容易有获得感和幸福感,从而有进一步学习的勇气和道路自信,其它的方法都可以触类旁通,进而获得更大意义上的自由。
应该说,本文的环境是WSL下的ubuntu18.04,在其它系统上可能会产生一些细微的差异,需要灵活运用。
后面有时间的话还会有些类似的文章,扫清这种没有任何技术含量的学习障碍,从而使初学者能够将有限的时间放到有价值的事情上去。