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


157

我对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来进行构建和运行。任何帮助都会很棒,谢谢。


您也经常需要-D_XOPEN_SOURCE=600。另请参阅带有-std = c99的GCC抱怨不知道struct timespec
jww

Answers:


285

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


如果我手动进行编译,则可以正常工作-我知道如何在代码块中自动进行编译吗?
naspinski 2010年

7
尝试Project-> Build Options-> Linker Settings; 然后添加库rt
Dmitry Yudakov 2010年

您的建议对我来说很好。.我刚开始C...该-lrt怎么办?
2013年

3
很抱歉在这个联合g++ -o main -lrt main.cpp中没有菜,但是您能在一个完整的例子中使用它吗,类似的东西对我不起作用
puk

4
@puk尝试把-lrtmain.cpp-共享库的顺序事情-看到这个那个的更多详细信息
梅德Yudakov

42

例:

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

对于gcc4.6.1版,-lrt必须 filefork.cpp 之后,否则会出现链接错误。

一些较旧的gcc版本不在乎位置。


9
谢谢,-lrt位置不对使我头疼。这种疯狂的(有很多人说是犯罪的)环境有动机吗?
Avio,2012年

@Avio-由于历史原因,订单很重要。编译器过去只是按顺序处理每个参数。因为库是“软”引用,而不是参数中的“硬”引用,所以除非先前引用*.o了库函数,否则它们将被忽略,这意味着在左侧。
Mark Lakata 2014年

28

从glibc 2.17版开始,-lrt不再需要库链接。

clock_*现在,它们已成为主要C库的一部分。您可以看到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是否会有任何问题,可以检查glibc兼容性跟踪器

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

ldd --version

(当然,如果您使用的是旧的glibc(<2.17),则仍然需要使用-lrt。)


26

我遇到了同样的错误。我的链接器命令确实包含了rt库-lrt,它是正确的,并且运行了一段时间。重新安装Kubuntu后,它停止工作。

一个单独的论坛线程建议-lrt需要在项目对象文件之后进行。-lrt尽管不知道为什么将其移至命令末尾,但对我来说却解决了此问题。


7
从ircnet引用twkm:链接器仅维护所需符号的列表。搜索完文件的符号后,仅保留其需要的内容,将其提供的内容丢弃,并移至下一个文件名。所以从左到右,但很健忘。
domen 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.