This question already has answers here:
GCC with -std=c99 complains about not knowing struct timespec
(2个答案)
三年前关闭。
您好,提前感谢这个平台过去为我解决的所有问题。不幸的是,我发现了一个我无法解决的问题。
我对cmake很陌生,我用一个新的可执行文件和一些库文件扩展了一个演示项目。我编译演示项目没有问题。但是,我的新项目需要用c99标准编译,突然之间,我在实现timepec struct.h时出现了错误。这也被用在演示项目中,所以我用c99再次编译了演示,我也遇到了同样的问题。
在Ubuntu上运行,使用gcc编译器和cmake 2.8.7版本
希望我有所有必要的细节。如果没有,请让我知道,并提前感谢你的努力!
致意
编辑1:收到错误消息:
->时钟单调-无法解析字段“tv-nsec”
-无法解析字段“电视秒”
-符号“时钟单调”无法解析
-函数“clock-gettime”、“nanosleep”、“timeradd”、“timercmp”的隐式声明警告
编辑#2:make VERBOSE=1时的错误输出
/usr/bin/gcc  -D_XOPEN_SOURCE=600 -I/home/localadmin/Eclipse_Workspace/SOEM_master/soem -I/home/localadmin/Eclipse_Workspace/SOEM_master/osal -I/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux -I/home/localadmin/Eclipse_Workspace/SOEM_master/oshw/linux    -std=c99 -o CMakeFiles/soem.dir/osal/linux/osal.c.o   -c /home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:60:50: Warning: »struct timezone« declared in parameter list [activated by default]
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:60:50: Warning: range of validity includes only this definition or declaration [activated by default]
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c: In function »osal_timer_start«:
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:105:4: Warning: Implicit function »timeradd« [-Wimplicit-function-declaration]
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c: In function »osal_timer_is_expired«:
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:120:4: Warning: Implicit declaration of function »timercmp« [-Wimplicit-function-declaration]
/home/localadmin/Eclipse_Workspace/SOEM_master/osal/linux/osal.c:120:61: Error: expected expression before »<« token
make[2]: *** [CMakeFiles/soem.dir/osal/linux/osal.c.o] Error 1
make[2]: Leaving directory '/home/localadmin/Eclipse_Workspace/SOEM_master/build'
make[1]: *** [CMakeFiles/soem.dir/all] Error 2
make[1]: Leaving directory '/home/localadmin/Eclipse_Workspace/SOEM_master/build'
make: *** [all] Error 2

这是在定义XOPEN_SOURCE=600之后的输出,这是在下面的另一个线程中提出的建议。因此,timespec结构可用,但函数不可用。
编辑3:最小、完整和可验证的示例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
int main()
{
struct timespec test;
test.tv_sec = 0;
struct timeval start_time;
struct timeval timeout;
struct timeval stop_time;
timeradd(&start_time, &timeout, &stop_time);
return 0;
}

编译没有问题。如果我使用gcc mcv_example.c-std=c99,我得到:
mcv_example.c: In function 'main':
mcv_example.c:24:18: error: storage size of 'test' isn't known
mcv_example.c:29:2: warning: implicit declaration of function 'timeradd' [-Wimplicit-function-declaration]

编辑4:我的解决方案是使用gnu99而不是c99。现在我可以用cmake创建UNIX makefile,但是仍然不能创建一个有效的Eclipse项目。
既然是另一个问题,我想这个案子已经结案了,谢谢大家的帮助和努力!

最佳答案

正如man timeradd所说,功能timeradd的定义只有在定义了_DEFAULT_SOURCE功能测试宏时才可用:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

   All functions shown above:
       Since glibc 2.19:
           _DEFAULT_SOURCE
       Glibc 2.19 and earlier:
           _BSD_SOURCE

man feature_test_macros_DEFAULT_SOURCE宏的说明如下:
可以定义此宏以确保“默认”定义
即使默认设置被禁用,
当显式定义单个宏时,或者
编译器在其“标准”模式中调用(例如。,
cc-标准=c99)。
因此,您需要明确定义_DEFAULT_SOURCE宏,使函数timeradd-std=c99模式下可用:
#define _DEFAULT_SOURCE
#include <sys/time.h>
...
timeradd(...);

关于c - 将C标准更改为c99后,使用UNIX time.h时出错。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39487193/

10-16 17:16