我正在尝试移植一个应用程序来驱动使用 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
有关如何解决此问题的任何指南?
我正在尝试移植一个应用程序来驱动使用 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
有关如何解决此问题的任何指南?
被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} 行为的方法。memcpy
memcpy
memcpy
memcpy
一些程序依赖于 {begin → end} 副本。当程序使用重叠缓冲区时,会memcpy
产生未定义的行为。在这种情况下,一个程序应该使用memmove
,但由于发生了 {begin → end} 的副本,它们得以通过。另请参阅mp3 flash 网站上的奇怪声音(由于 Adobe 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");
自述文件提到了 glibc 2.15 附带的 Ubuntu 12.04。您使用的是 glibc 2.11.1 附带的 Ubuntu 10.04。您看到的错误消息告诉您链接到的一些二进制文件(这里很可能libftd2xx.so
)依赖于比您正在链接的更新的 glibc,考虑到前面的事实,这是合乎逻辑的。
要么libftd2xx.so
根据系统的 glibc 版本从源代码重新编译(可能不是一个选项,因为它只是二进制文件),或者更新你的操作系统。Ubuntu 10.04 已经很老了。
作为最后的手段(只有在你喜欢的情况下才尝试这样做,嗯,用大锤敲击你的手指),你可以为你的系统编译一个更新的 glibc,然后将它安装在类似/opt
.
这是一个带有“opatchauto”的 Oracle 错误。请参阅此网址,https://dba010.com/2019/06/24/19cgi-12crdbms-opatchauto-re-link-fails-on-target-procob/。解决方法:为每个适用的数据库补丁手动使用“opatch”,而不是“opatchauto”。
我不确定,但如果它是您使用的交叉编译器,则必须在某处(不在 and 中)安装兼容版本的基本库,并且/usr/include
您/usr/lib
必须确保编译器使用它们,而不是那些对于本机编译器。并且您必须确保整个工具链是版本兼容的。(而且我知道这不是一个非常完整的答案,但这就是我所知道的。)
您可以下载并编译 libc,然后安装在/opt/lib/libcX/libc.so.6
. 然后,你可以有一个脚本:
LD_LIBRARY_PATH=/opt/lib/libcX:/lib/:/usr/lib:/usr/share/lib
./your_program
升级到 Ubuntu 12.04。我使用 也发生了同样的事情Qt
,结果发现 glibc 库太旧了。谷歌搜索表明尝试自己升级 glibc 是一个非常危险的提议。