为什么GCC要求隐式声明clock_gettime(),但预处理器对相关宏非常满意?

为什么GCC要求隐式声明clock_gettime(),但预处理器对相关宏非常满意?,c,gcc,time,glibc,C,Gcc,Time,Glibc,我试图尽可能准确地测量手术所花费的时间。我的研究让我相信我想要的是时钟和朋友 然而,我这辈子都不能让它工作。考虑这个看似微不足道的例子: #include <time.h> #include <unistd.h> int main(void) { struct timespec t; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t); return 0; } 但是,如果我尝试编译预处理的代码,它不会

我试图尽可能准确地测量手术所花费的时间。我的研究让我相信我想要的是
时钟和朋友

然而,我这辈子都不能让它工作。考虑这个看似微不足道的例子:

#include <time.h>
#include <unistd.h>

int main(void)
{
    struct timespec t;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
    return 0;
}
但是,如果我尝试编译预处理的代码,它不会:

$ cpp time.c > time-prep.c
$ cc -o time -Wall -std=c11 -lrt time-prep.c
/tmp/user/1000/cc00SdhB.o: In function `main':
time-prep.c:(.text+0x15): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
$ 
如果我尝试编译原始版本,它不会有任何改进:

$ cc -o time -Wall -std=c11 -lrt time.c
time.c: In function ‘main’:
time.c:6:18: error: storage size of ‘t’ isn’t known
time.c:7:2: warning: implicit declaration of function ‘clock_gettime’ [-Wimplicit-function-declaration]
time.c:7:16: error: ‘CLOCK_PROCESS_CPUTIME_ID’ undeclared (first use in this function)
time.c:7:16: note: each undeclared identifier is reported only once for each function it appears in
time.c:6:18: warning: unused variable ‘t’ [-Wunused-variable]
$ 
clock_gettime的手册页上说我需要

链接到
-lrt
(仅适用于2.17之前的glibc版本)

但正如你所看到的,我已经在这么做了。在我的情况下,添加或删除
-lrt
cc
似乎没有任何区别

我已经查看了
/usr/include/time.h
,但没有看到任何明显的遗漏


在我的代码中使用clock_gettime()缺少什么(可能是微不足道的)咒语?

clock_gettime()的Linux文档指定了功能测试要求:

_POSIX_C_SOURCE >= 199309L
<>你可以考虑直接执行代码,也许在代码的开始时通过<代码>定义< /Cult>指令,因为代码实际上依赖于它。


如果您没有提供这样的
#define
,则
gcc
仍可以为您提供,具体取决于您为其指定的选项。默认情况下,它可以。与
-std=gnu99
-std=gnu11
类似。但是您试图使用
-std=c11
进行编译,这要求严格遵守c11。C11没有定义所需的POSIX功能测试宏。

您可以在上面定义_GNU_SOURCE任意#包含。有一个例子:

$cat./main.c

// Need for clock_gettime()
// Have to be at the begining of the file
#define _GNU_SOURCE

#include <time.h>
#include <unistd.h>

int main(void)
{
    ...
}
//需要时钟\u gettime()
//必须在文件的开头
#定义GNU源
#包括
#包括
内部主(空)
{
...
}

在您的环境中,是否在
中定义了
\u POSIX\u计时器
?可能是时间。在unistdTry将
-lrt
添加到命令行末尾后应包含h。请尝试将
--verbose
传递到链接器。你认为直接使用<代码> GCC < /代码>而不是直接使用<代码> cc>代码>吗?我相信@尤金尼斯。明白了,谢谢!这就成功了。我想考虑一下它的影响,但至少这解决了眼前的问题。它也适用于真实代码;或者至少,添加它清除了与新添加的计时代码相关的一组错误,只留下看起来合法的错误(其中一些是预期的,因为我在这个过程中更改了一些方法签名)。
// Need for clock_gettime()
// Have to be at the begining of the file
#define _GNU_SOURCE

#include <time.h>
#include <unistd.h>

int main(void)
{
    ...
}