Testprintenv:加载共享库时出错:libodbc.so.1:无法打开共享对象文件

时间:2014-06-25 11:01:40

标签: c linux shared-libraries solaris dynamic-linking

我正在尝试调用一个C-Program,它从配置文件中返回给定关键字的值

在尝试调用程序时,它会显示以下错误:

**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上以及如何解决?

提前致谢,

2 个答案:

答案 0 :(得分:1)

  

有没有检查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/

答案 1 :(得分:0)

确定,

首先解释一下:

您正在尝试使用需要UNIXODBC的软件。

根据你自己的ldd结果,它说:

**Testprintenv: error while loading shared libraries: libodbc.so.1: cannot open shared object file: No such file or directory**

关于LDD,手册页说:

  

ldd - 打印共享库依赖项

所以这个程序你试图运行 DOES NEED 提供的BY UNIXODBC libodbc。 您可以查看rpmfind here

由于Solaris是另一个平台,它可能会或不会使用它。 (因为Solaris有其他方法来处理你想要做的事情)

因此,请检查链接并阅读安装部分。

您的软件共享链接到UNIXODBC而非静态的原因是

Dynamic Data Binding

This allows the user or the system administrator to easily configure an application to use any ODBC compliant data source. This is perhaps the single biggest advantage of coding an application to the ODBC API and to purchase these applications. Dyamic binding allows the end-user to pick a data source, ie an SQL Server, and use it for all data applications without having to worry about recompiling the application.

通过使用非静态依赖,easysoft用户可以连接到任何数据库。