linux执行程序:error while loading shared libraries

时间:2023-02-13 09:41:31

linux下有原来别人写好的程序SDK,现在客户要求提供64位的版本,于是修改编译选项 -m32 为 -m64,由于原始代码没有考虑64位的情况,所以对相关代码也进行了修改,其中主要是指针相关的内容,代码中有用32位的整数来保持指针的值,所以这部分是修改的重点。
代码修改完后,编译顺利。
注意,为了和32位版本的区别,64位的SDK文件名后面添加了“64”,这样32位和64位可以同时存在,互不影响。
在编译完后拷贝到 /usr/lib 目录中,如下为32位和64位的两个文件:

[root@localhost test]# ls -l /usr/lib/libVideo*
-rw-r–r– 1 root root 2046494 Sep 20 16:37 /usr/lib/libVideoSDK.so
-rwxrwxrwx 1 root root 2046494 Sep 20 17:39 /usr/lib/libVideoSDK64.so

编译完demo后,运行demo:
[root@localhost test]# ./test64
结果提示如下:
./test64: error while loading shared libraries: libVideoSDK64.so: cannot open shared object file: No such file or directory

有点奇怪,库文件所在的目录没错,之前32位都是这样测试的,后来去网上查找,除了说确实是缺少文件之外,其它大致都是说可以安装其它版本的程序,显然这不适合我的情况,我可以确保所要求的文件确实在对应的目录中。
其中有一个贴子这样描述:

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

echo “/usr/local/lib” >> /etc/ld.so.conf

ldconfig

这个说法也不太对,当然后面的几行命令有啥用,特别是#echo那一行,我确实不知道,但上面的描述说“找不到该共享库文件”,从执行的结果看,确实是找不到库文件,但是我执行32位的程序是没有问题,它就可以找到对应的库文件,显然64位的库文件和32位的库文件在同一目录,不可能一个找得到一个找不到,这就奇怪了。

问题同事,似乎也没解。
最后再捉摸上面的那个说明,不管其它的,先照着重新加载一下配置:
[root@localhost test]# ldconfig
然后再执行程序:
[root@localhost test]# ./test64
这个可以了!
这个libVideoSDK64.so之前在 /usr/lib 目录中是没有的,这是我编译后新拷贝进去的,所以可能linux 事先把文件列表放入了内存中,所以如果有新的文件放入这个目录而且要用的话,就必需采用 ldconfig 来刷新内存中的库文件列表才行。

还好,算是找到问题了