我试图调用一个c程序,它从配置文件中返回给定关键字的值
尝试调用程序时,显示以下错误:
**Testprintenv: error while loading shared libraries: libodbc.so.1: cannot open shared object file: No such file or directory**
我们之前已经安装了easysoft并卸载回来(删除了所有目录)。
以下依赖项在Linux机器上显示
**
-bash-4.1$ ldd Testprintenv
linux-vdso.so.1 => (0x00007fffc0bdb000)
libodbc.so.1 => not found
libodbcinst.so.1 => not found
libc.so.6 => /lib64/libc.so.6 (0x000000397b200000)
/lib64/ld-linux-x86-64.so.2 (0x000000397ae00000)
**
当我们在solaris上尝试相同的程序时,计算机依赖项会以不同的方式显示,并且执行时不会出现任何错误:
[Testuser]$ ldd Testprintenv
libsocket.so.1 => /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libscf.so.1 => /lib/libscf.so.1
libdoor.so.1 => /lib/libdoor.so.1
libuutil.so.1 => /lib/libuutil.so.1
libgen.so.1 => /lib/libgen.so.1
libm.so.2 => /lib/libm.so.2
/platform/SUNW,SPARC-Enterprise/lib/libc_psr.so.1
了解为什么依赖关系(libodbc.so.1)只出现在Linux上以及如何解决?
提前谢谢你,
最佳答案
是否仍要检查c可执行文件与ldd以外的库之间的关系?
任何关于依赖关系(libodbc.so.1)为什么只出现在
Linux和如何解决?
1)如果你想知道为什么会有依赖关系,我建议你试着寻找共同的符号。不幸的是,您必须安装libodbc库,因为无法从Testprintenv
二进制文件中找到要与此库链接的符号。
所以,这样做:
# symbols needed by the Testprintenv binary:
nm -uD Testprintenv | tr -s " " | cut -f 3 -d" " > /tmp/symbols_needed
# symbols provided by the libodbc
nm --defined-only -D /lib/PATH_TO_YOUR_LIBRARY/libodbc.so.1 | cut -f 3 -d " " > /tmp/symbols_lib
# intersection of the two sets:
grep -w -F -f /tmp/symbols_needed /tmp/symbols_lib
最后一个命令将列出testprintenv需要的符号和libodbc提供的符号。
2)如何解决问题?
首先,安装库(libodbc),它现在可以工作了吗?
如果没有,请确保它在standard directories中。
如果没有,请将libodbc所在的目录添加到ld_preload环境变量中,例如:
LD_PRELOAD=/home/ivan/my_lib/
关于c - Testprintenv:加载共享库时出错:libodbc.so.1:无法打开共享对象文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24406861/