我正在 Ubuntu 12.04 上编译一个 C++ 项目,我收到一个链接错误说明
undefined reference to `clock_gettime@GLIBC_2.17'
undefined reference to `clock_getres@GLIBC_2.17'
我阅读了很多关于这个问题的帖子,并且尝试了所有常用的解决方案(分别)。比如在g++
命令行中加入-lrt
标志(我在开头和结尾都试过了),设置cmake linker flags变量为-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 的更新版本?
提前致谢!
最佳答案
尽管(因为 OS 很古老)它可能不再适用,写一个答案(因为 @ecnl 多年没有访问该站点)。
每个 OS (Nix) 都带有一个 [GNU]: The GNU C Library (glibc)可以在 OS 生命周期内升级的版本(与任何其他软件包一样)。
Ubuntu Precise(12.04),有(在提问时)LibC 2.15([LaunchPad]: Binary package “libc-bin” in ubuntu precise )项目使用的(第 3rd 方)库 (.so) 是针对(并链接到)LibC < strong>2.17
根本原因是在两个版本之间,clock_* 函数从 LibRT 移到了 LibC(正如[SO]: C++ error: undefined reference to 'clock_gettime' and 'clock_settime' (@P.P's answer)(并引用了 [SourceWare]: Move clock_* symbols from librt to libc.))。
因此,链接到 v2.17 的 ELF 将不会在 v2.15 上运行,因为它希望这些函数能够由 LibC 导出。可能的修复:
使用 v2.15 重建 .so(OP 已采用该选项)
将 LibC 升级到 v2.17。然而,这可能会引发一些不兼容问题(其他依赖于 v2.15 的东西可能会停止工作),因此必须仔细考虑这一点
关于c++ - 在 Ubuntu 12.04 上链接 - 对 `clock_gettime@GLIBC_2.17' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30751893/