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

Testprintenv:加载共享库时出错:libodbc.so.1:无法打开共享对象文件,c,linux,shared-libraries,solaris,dynamic-linking,C,Linux,Shared Libraries,Solaris,Dynamic Linking,我试图调用一个C程序,该程序从配置文件中返回给定关键字的值 尝试调用程序时,显示以下错误: **Testprintenv: error while loading shared libraries: libodbc.so.1: cannot open shared object file: No such file or directory** 我们以前安装过EasySoft,后来又卸载了(删除了所有目录) Linux机器上显示了以下依赖项 ** ** 当我们在Solaris上尝试相同的程序时

我试图调用一个C程序,该程序从配置文件中返回给定关键字的值

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

**Testprintenv: error while loading shared libraries: libodbc.so.1: cannot open shared object file: No such file or directory**
我们以前安装过EasySoft,后来又卸载了(删除了所有目录)

Linux机器上显示了以下依赖项 **

**

当我们在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上,以及如何解决

提前谢谢,

好的

首先是一些解释:

您正在尝试使用一个需要的软件

根据您自己的ldd结果显示:

**Testprintenv: error while loading shared libraries: libodbc.so.1: cannot open shared object file: No such file or directory**
现在关于LDD,手册页上说:

ldd-打印共享库依赖项

因此,您试图运行的这个程序确实需要提供的libodbc。 您可以检查rpmfind

由于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用户能够连接到任何数据库

是否有检查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),它现在可以工作了吗
  • 如果没有,请确保它位于
  • 如果没有,请将libodbc所在的目录添加到LD_PRELOAD环境变量中,如:
    LD_PRELOAD=/home/ivan/my_lib/

printenv是Linux计算机上唯一出现此错误的程序吗?如果不是,我将查看$LD_PRELOAD环境变量。我假设您所说的printenv不是标准printenv命令,因为标准printenv没有执行您所描述的操作。你自己编译的吗?它来自哪里?@harmic,printenv不是一个标准命令,我在这里发布时重命名了程序名。@TimM,$LD_PRELOAD为空您使用的发行版是什么?你安装了libobdc软件包吗?我的程序与UNIXODBC无关。它只是从路径中读取键值对并返回输出。我也验证了#include语句。是否还有其他方法来检查c可执行文件和库之间的关系ldd@RamuPasupuleti检查这个答案非常有用,我可以得到我的程序所需的符号列表。但是,libodbc和我的程序提供的符号没有交叉点……任何迹象,为什么依赖项会显示出来,即使我们没有任何公共符号。@RamuPasupuleti,您可以使用相同的过程查看其他库,它们可能需要libodbc。
# 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