为什么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)
{
...
}