在 Ubuntu 12.04 上链接 - 未定义对"clock_gettime@GLIBC_2.17"的引用



我正在 Ubuntu 12.04 上编译一个C++项目,但出现链接错误,指出

对"clock_gettime@GLIBC_2.17"的未定义引用

对"clock_getres@GLIBC_2.17"的未定义引用

我阅读了很多关于这个问题的帖子,并尝试了所有常用的解决方案(单独)。例如将-lrt标志添加到g++命令行(我在开头和结尾都尝试过),将cmake链接器标志变量设置为-lrt,将 librt.so 位置添加到link_directories变量甚至target_link_libraries。这些都不起作用。

当我跑ldd --version时,我得到

ldd (Ubuntu EGLIBC 2.15-0ubuntu10.12) 2.15

根据我从研究中了解到的,这是 Ubuntu 12.04 的最后一个 glibc 版本。但是错误引用了glibc 2.17...所以我的问题是:我是否因为 gclib 版本而收到此错误?有什么方法可以获得 Ubuntu 12.04 的更新版本吗?

提前谢谢你!

虽然(因为操作系统是古老的)它可能不再适用,写一个答案(因为@ecnl多年没有访问该网站)。

  • 每个操作系统Nix)都提供了一个[GNU]:GNU C库(glibc)版本,该版本(像任何其他软件包一样)可以在操作系统生命周期内升级。
    Ubuntu Precise12.04),有(在提问时间)LibC 2.15([LaunchPad]:二进制包"libc-bin"在ubuntu precision)

  • 项目使用的( 3 方)库 (.so) 是针对 LibC 2.17 构建的(并链接到)

造成这种情况的根本原因是,在 2 个版本之间,clock_* 函数从 LibRT 移动到 LibC(如 [SO] 所指出的:C++错误:未定义对"clock_gettime"和"clock_settime"的引用(@P.P 的答案)(并引用 [SourceWare]:将clock_* 符号从 librt 移动到 libc。
因此,链接到 v2.17ELF 将不会在 v2.15 上运行,因为它希望这些函数由 LibC 导出。可能的修复:

  1. 使用 v2.15 重建 .soOP 已经使用了该选项)

  2. LibC 升级到 v2.17。但是,这可能会引发一些不兼容问题(其他依赖于v2.15的内容可能会停止工作),因此必须仔细考虑

最新更新