我正在尝试移植一个应用程序来驱动使用 ftdi2332h 芯片的设备从 Windows 到 Linux。我在 ubuntu 10.04 系统上安装了 libftd2xx 库 per these instructions .
当我尝试编译任何示例程序时,出现以下错误:
/usr/local/lib/libftd2xx.so: undefined reference to `memcpy@GLIBC_2.14'
collect2: ld returned 1 exit status
关于如何解决这个问题的任何指南?
最佳答案
mempcy@GLIBC_2.14
称为版本符号。 Glibc 使用它们,而其他运行时库,如 musl do not .
mempcy@GLIBC_2.14
在 Linux 上编译时的重要性是由于 Glibc 改变了 memcpy
在 2012 年的工作方式。 memcpy
用于复制字节{开始→结束}(低内存地址到高内存地址)。 Glibc 2.13 提供了一个优化的 memcpy
,可以在某些平台上复制 {end → begin}。我相信“某些平台”包括带有 SSE4.1 的英特尔机器。然后,Glibc 2.14 提供了一个 memcpy
来恢复 {begin → end} 行为。
一些程序依赖于 {begin → end} 拷贝。当程序使用重叠缓冲区时,memcpy
会产生未定义的行为。在这种情况下,程序应该使用 memmove
,但由于发生了 {begin → end} 的复制,它们已经过去了。另见 Strange sound on mp3 flash website (由于 Adobe Flash),Glibc change exposing bugs (在 LWN 上),The memcpy vs memmove saga和 friend 。
要修复它,您可以将以下内容添加到您的源代码中:
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
也许像下面这样。然后在您的项目中包含额外的源文件。
$ cat version.c
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
关于c++ - 在 Linux 上编译时未定义对 mempcy@GLIBC_2.14 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12286460/