15

我正在尝试移植一个应用程序来驱动使用 ftdi2332h 芯片的设备从 windows 到 linux。我按照这些说明在 ubuntu 10.04 系统上安装了 libftd2xx 库。

当我尝试编译任何示例程序时,我收到以下错误:

/usr/local/lib/libftd2xx.so: undefined reference to `memcpy@GLIBC_2.14'
collect2: ld returned 1 exit status

有关如何解决此问题的任何指南?

4

6 回答 6

14

mempcy@GLIBC_2.14称为版本符号。Glibc 使用它们,而musl 等其他运行时库则不使用它们。

在 Linux 上编译的意义在于 Glibc在 2012 年mempcy@GLIBC_2.14改变了工作方式。用于复制字节 {begin → end}(低内存地址到高内存地址)。Glibc 2.13 提供了在某些平台上复制 {end → begin} 的优化。我相信“某些平台”包括带有 SSE4.1 的英特尔机器。然后,Glibc 2.14 提供了一个恢复 {begin → end} 行为的方法。memcpymemcpymemcpymemcpy

一些程序依赖于 {begin → end} 副本。当程序使用重叠缓冲区时,会memcpy产生未定义的行为。在这种情况下,一个程序应该使用memmove,但由于发生了 {begin → end} 的副本,它们得以通过。另请参阅mp3 flash 网站上的奇怪声音(由于 Adob​​e Flash)、Glibc 更改暴露错误(在 LWN 上)、memcpy vs memmove 传奇和朋友。

要修复它,您似乎可以将以下内容添加到源代码中:

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");

也许像下面这样。然后在您的项目中包含额外的源文件。

$ cat version.c

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
于 2019-02-21T20:04:44.467 回答
3

自述文件提到了 glibc 2.15 附带的 Ubuntu 12.04。您使用的是 glibc 2.11.1 附带的 Ubuntu 10.04。您看到的错误消息告诉您链接到的一些二进制文件(这里很可能libftd2xx.so)依赖于比您正在链接的更新的 glibc,考虑到前面的事实,这是合乎逻辑的。

要么libftd2xx.so根据系统的 glibc 版本从源代码重新编译(可能不是一个选项,因为它只是二进制文件),或者更新你的操作系统。Ubuntu 10.04 已经很老了。

作为最后的手段(只有在你喜欢的情况下才尝试这样做,嗯,用大锤敲击你的手指),你可以为你的系统编译一个更新的 glibc,然后将它安装在类似/opt.

于 2015-02-17T20:12:43.863 回答
1

这是一个带有“opatchauto”的 Oracle 错误。请参阅此网址,https://dba010.com/2019/06/24/19cgi-12crdbms-opatchauto-re-link-fails-on-target-procob/。解决方法:为每个适用的数据库补丁手动使用“opatch”,而不是“opatchauto”。

于 2019-10-20T16:20:09.023 回答
0

我不确定,但如果它是您使用的交叉编译器,则必须在某处(不在 and 中)安装兼容版本的基本库,并且/usr/include/usr/lib必须确保编译器使用它们,而不是那些对于本机编译器。并且您必须确保整个工具链是版本兼容的。(而且我知道这不是一个非常完整的答案,但这就是我所知道的。)

于 2012-09-05T17:41:06.460 回答
0

您可以下载并编译 libc,然后安装在/opt/lib/libcX/libc.so.6. 然后,你可以有一个脚本:

LD_LIBRARY_PATH=/opt/lib/libcX:/lib/:/usr/lib:/usr/share/lib
./your_program
于 2012-09-05T17:23:41.517 回答
-2

升级到 Ubuntu 12.04。我使用 也发生了同样的事情Qt,结果发现 glibc 库太旧了。谷歌搜索表明尝试自己升级 glibc 是一个非常危险的提议。

于 2012-09-05T17:11:10.683 回答