当前位置: 首页>>技术问答>>正文


C++错误:对’clock_gettime’和’clock_settime’的未定义引用

, , , ,

问题描述

我对Ubuntu很新,但我似乎无法让它工作。它在我的学校电脑上工作正常,我不知道我在做什么。我检查了usr /include和time.h就好了。这是代码:

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    //do stuff here
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    return 0;
}

我正在使用CodeBlocks作为我的IDE来构建和运行。任何帮助都会很棒,谢谢。

最佳解决思路

-lrt添加到g ++命令行的末尾。这链接在librt.so “Real Time”共享库中。

次佳解决思路

例:

c++ -Wall filefork.cpp -lrt -O2

对于gcc版本4.6.1,-lrt必须在filefork.cpp之后,否则会出现链接错误。

一些较旧的gcc版本并不关心这个位置。

第三种解决思路

我遇到了同样的错误。我的链接器命令确实包含了包含-lrt的rt库,这是正确的并且它已经工作了一段时间。在re-installing Kubuntu之后它停止了工作。

一个单独的论坛帖子建议-lrt需要在项目对象文件之后。将-lrt移动到命令的末尾为我解决了这个问题,虽然我不知道原因的细节。

第四种思路

自glibc 2.17起,不再需要连接-rt的库。

clock_*现在是主C库的一部分。您可以看到完成此更改的change history of glibc 2.17解释了此更改的原因:

+* The `clock_*' suite of functions (declared in <time.h>) is now available
+  directly in the main C library.  Previously it was necessary to link with
+  -lrt to use these functions.  This change has the effect that a
+  single-threaded program that uses a function such as `clock_gettime' (and
+  is not linked with -lrt) will no longer implicitly load the pthreads
+  library at runtime and so will not suffer the overheads associated with
+  multi-thread support in other code such as the C++ runtime library.

如果您决定升级glibc,那么如果您担心使用较新的glibc是否会出现任何问题,您可以查看compatibility tracker of glibc

要检查系统上安装的glibc版本,请运行以下命令:

ldd --version

(当然,你使用的是旧的glibc(< 2.17),那么你仍然需要-lrt。)

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6639.html,未经允许,请勿转载。