我正在 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 Precise (12.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.17 的 ELF 将不会在 v2.15 上运行,因为它希望这些函数由 LibC 导出。可能的修复:
-
使用 v2.15 重建 .so(OP 已经使用了该选项)
-
将 LibC 升级到 v2.17。但是,这可能会引发一些不兼容问题(其他依赖于v2.15的内容可能会停止工作),因此必须仔细考虑