【问题标题】:Testprintenv:error while loading shared libraries:libodbc.so.1: cannot open shared object fileTestprintenv:加载共享库时出错:libodbc.so.1:无法打开共享对象文件
【发布时间】:2014-06-25 11:01:39
【问题描述】:

我正在尝试调用一个 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 上以及如何解决?

提前致谢,

【问题讨论】:

  • 是 printenv 是 Linux 计算机上唯一出现该错误的程序吗?如果没有,我会查看 $LD_PRELOAD 环境变量。
  • 我假设您正在谈论的 printenv 不是标准的 printenv 命令,因为标准的命令没有执行您所描述的操作。你自己编译的吗?它来自哪里?
  • @harmic,printenv 不是标准命令,我在这里发帖时重命名了程序名称..
  • @TimM,$LD_PRELOAD 为空
  • 您使用的是什么发行版?你安装 libobdc 包了吗?

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


【解决方案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/

【讨论】:

  • 它非常有用,我可以得到我的程序所需的符号列表。但是,libodbc 和我的程序提供的符号没有交集......任何景象,为什么即使我们没有任何公共符号也会显示依赖关系......
  • @RamuPasupuleti,您可以使用相同的程序查看其他库,它们可能需要 libodbc。
【解决方案2】:

好的,

先解释一下:

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

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

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

现在关于 LDD 手册页说:

ldd - 打印共享库依赖项

所以您尝试运行的这个程序是否需要UNIXODBC 提供的 libodbc。 您可以查看 rpmfind here

由于 Solaris 是另一个平台,它可能使用也可能不使用。 (因为 Solaris 有其他方法来处理您正在尝试做的事情)

所以请检查链接并阅读安装部分。

您的软件共享链接到 UNIX ODBC 而不是静态的原因是

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

【讨论】:

  • 我的程序与 UNIXODBC 无关。它只是从路径中读取键值对并返回输出。我也验证了#include 语句。无论如何要检查 c 可执行文件与 ldd 以外的库之间的关系
  • @RamuPasupuleti 检查这个答案stackoverflow.com/questions/42308/…
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 2018-12-17
  • 2021-05-01
  • 2013-06-11
  • 2019-05-31
  • 2020-10-19
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多