在Linux上编译时未定义的引用mempcy@GLIBC_2.14

use*_*551 10 c++ porting undefined-reference ftdi

我试图移植一个应用程序来驱动一个使用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
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的指导原则?

jww*_*jww 6

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

mempcy@GLIBC_2.14在Linux 上进行编译的重要性是由于Glibc memcpy在2012年更改了工作方式memcpy。end}(从低内存地址到高内存地址)。Glibc 2.13提供了一个优化的memcpy复制{end?在某些平台上开始}。我相信“某些平台”包括带有SSE4.1的英特尔机器。然后,Glibc 2.14提供了一个memcpy还原{开始?结束}行为。

有些程序依赖于{开始?结束}副本。当程序使用重叠缓冲区时,则会memcpy产生未定义的行为。在这种情况下,本应使用一个程序memmove,但由于出现了复制,所以它们无法通过{ 结束}。另请参阅mp3 Flash网站上的奇怪声音(由于Adobe Flash),Glibc更改暴露的错误(在LWN上),memcpy vs memmove传奇和朋友。

要修复它,您可以在源代码中添加以下内容:

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Run Code Online (Sandbox Code Playgroud)

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

$ cat version.c

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Run Code Online (Sandbox Code Playgroud)


Mat*_*ips -2

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