【发布时间】:2013-02-02 13:32:06
【问题描述】:
我正在开发一个项目,该项目使用 ftdi D2XX 驱动程序与 ENTTEC DMX usb pro 设备连接。 ftdi 驱动程序(libftdi2xx.so.1.1.12 存储在 /usr/local/lib/ 中)是针对 glibc v2.14 或更高版本编译的。
我正在 debian 7 上开发,它只支持 glibc v2.13。当执行我编写的 C 代码(调用 ftdi 驱动程序)时,它给出了一个错误:
./a.out: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/libftd2xx.so)
这是有道理的,知道 glibc 版本不兼容。我已将最新版本的 glibc (v2.17) 下载并安装到我计算机上的临时目录 ('~/glibc-testing/install/lib/') 中,并使用以下调用:
~/glibc-testing/install/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-testing/install/lib/ ./a.out
通过这个调用,我能够成功运行 C 代码。
我想将此 C 代码编译为共享库。它将用于与 DMX 设备交互,并由基于 C# 开发的主应用程序调用。
我不知道如何前进。看起来我需要做的是告诉 fdti 驱动程序始终使用较新的 glibc,同时让应用程序的其余部分使用普通库。 ftdi 2DXX 驱动程序仅提供预编译(无源代码可用)。有没有办法将这个预编译的程序链接到新库?
我研究了导出 LD_LIBRARY_PATH=/home/.../glibc/install/lib/ 的选项,但收效甚微。
谢谢!
【问题讨论】:
-
唯一明智的做法是尝试与制作驱动程序的人进行沟通,并请求与旧 glibc 链接的版本。
-
您是否尝试过使用 LD_PRELOAD?
-
我认为设置 rpath 应该可以解决问题,请参阅 here。 You can even reset the rpath in the application after compilation!
-
为什么应用程序的其余部分使用旧的 glibc 很重要?那是疯子。如果您无法获得与旧 glibc 链接的驱动程序,则针对较新的 glibc 构建整个应用程序。无论如何,您在运行时将需要更新的。
-
为了超越 Nikos 的评论,我特别要求提供符合某些版本的 Linux 标准基础 (LSB) 规范的驱动程序。供应商确实没有充分的理由分发不符合 LSB 的用户模式驱动程序。
标签: c shared-libraries glibc ftdi