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

标签 c++ porting undefined-reference ftdi

我正在尝试移植一个应用程序来驱动使用 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 (由于 Adob​​e 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/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 如何检查可执行文件或 DLL 是在发布还是 Debug模式下构建的 (C++)

javascript - 将 FTGL 与 Emscripten 结合使用

linux - 编译 runwhen - scan_uint 未定义?

.net - VBA:与 .NET 正则表达式平衡组不兼容?

windows-phone-7 - Core Data 相当于 Windows Phone

c - 将 CUDA 静态或共享库与 gcc 链接时出现 undefined reference 错误

c++ - 制作 JIT 编译器

c++ - 为什么析构函数不被异常调用?

wpf - 有没有办法移植 WPF 应用程序,使其可以在 mac-OS X 上运行?