linux libodbc.so.1,关于C#:Testprintenv:加载共享库时出错:libodbc.so.1:无法打开共享对象文件...

我正在尝试调用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软件包吗?

Is there anyway to check the relationships between c executable and libraries other than ldd?

Any insight why the dependency (libodbc.so.1) is only showing up on

linux and how to resolve?

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/

它非常有用,可以获取程序所需的符号列表。 但是,libodbc和我的程序没有提供符号的交集……任何人都可以看到,即使我们没有任何通用的符号,依赖性也为什么会显示出来。

@RamuPasupuleti,您可以使用相同的过程查看其他库,它们可能需要libodbc。

好,

首先来一些解释:

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

根据您的Ldd OWN结果,它表示:

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

现在关于LDD,手册页显示:

ldd - print shared library dependencies

因此,您尝试运行此程序是否需要UNIXODBC提供的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用户可以连接到任何数据库。

我的程序与UNIXODBC不相关。 它只是从路径中读取键值对并返回输出。 我也验证了#include语句。 反正有没有检查C可执行文件和LDD以外的库之间的关系

@RamuPasupuleti检查此答案stackoverflow.com/questions/42308/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值