将C标准更改为c99

时间:2016-09-14 09:39:10

标签: c linux cmake

您好,并提前感谢此平台过去为我解决的所有问题。不幸的是,我发现了一个我无法解决的问题。

我对cmake很新,并使用新的可执行文件和一些库文件扩展了一个演示项目。编译演示项目没有问题。但是,我的新项目需要使用c99标准编译,突然间,我从time.h实现了timespec结构的错误。这也用在演示项目中,所以我用c99再次编译了演示,我也遇到了同样的问题。

使用gcc编译器和cmake版本2.8.7

在Ubuntu上运行

希望我已经掌握了所有必要的细节。如果没有,请告诉我,并提前感谢您的努力!

祝你好运

编辑#1:我得到的错误消息:
- > CLOCK_MONOTONIC<未申报(首次使用此功能)
- field' tv_nsec'无法解决 - field' tv_sec'无法解决 - 符号' CLOCK_MONOTONIC'无法解决 - 隐含声明功能的警告' 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项目 由于这是一个不同的问题,我想这个案例已经结束,谢谢大家的帮助和努力!

1 个答案:

答案 0 :(得分:0)

正如man timeradd所说,只有在定义了timeradd feature-test-macro时,才能使用函数_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宏的说明:

  

可以定义此宏以确保&#34;默认&#34;定义   即使默认值被禁用,也会提供,   当明确定义单个宏时,或者   编译器在其标准&#34;标准之一中被调用。模式(例如,   cc -std = c99)。

因此,您需要明确定义_DEFAULT_SOURCE宏,以使timeradd模式下的make函数-std=c99可用:

#define _DEFAULT_SOURCE
#include <sys/time.h>
...
timeradd(...);