2016-09-14 146 views
0

您好,並提前感謝此平臺過去爲我解決的所有問題。不幸的是我發現了一個我無法解決的問題。將C標準更改爲c99後,使用UNIX time.h的錯誤

我對cmake非常陌生,並用新的可執行文件和一些庫文件擴展了一個演示項目。我在編譯演示項目時沒有問題。但是,我的新項目需要使用c99標準進行編譯,突然間,我得到了time.h中實現timepec結構的錯誤。這也是在演示項目中使用的,所以我使用c99重新編譯了演示,並且遇到了同樣的問題。

在Ubuntu上運行此,使用gcc編譯器和cmake的版本2.8.7

希望我已經得到了涵蓋了所有必要的細節。如果沒有,請讓我知道,並提前感謝您的努力!

問候

編輯#1:錯誤消息我得到:
- > CLOCK_MONOTONIC <未聲明(在一次使用此功能)
- 場 'tv_nsec' 無法解析
- 場「 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 

這是definining _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:使用C99的gnu99而不是對我的解決方案是。現在我可以用cmake創建UNIX Makefiles,但仍然無法創建正在運行的Eclipse項目。
由於這是一個不同的問題,我想這個案子是封閉的,謝謝大家的幫助和努力!

+0

請分享你的錯誤。 –

+0

對不起,沒有想到這一點。將其添加到原始帖子中,以便更多人可以看到它。 – jckaos

+0

根本沒有提及'cmake'的意思。輸入完成後,只需將gcc報告的錯誤複製/粘貼到shell中:'make VERBOSE = 1' – malat

回答

0

作爲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 

描述爲_DEFAULT_SOURCEman feature_test_macros說:

可以使用這個宏定義爲確保即使在默認值將被禁用時提供「默認」定義 , 也會發生單獨的宏被明確定義,或者編譯器以其「標準」模式之一調用(例如, cc -std = c99)。

所以,你需要在-std=c99模式明確地定義_DEFAULT_SOURCE宏化妝功能timeradd是可用:

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

感謝您的建議。我通過使用gnu99而不是c99解決了這個問題。現在一切正常,當我使用cmake生成UNIX Makefiles時。當我嘗試生成一個Eclipse項目時,我仍然遇到了timespec無法解析的錯誤,但我猜這是一個不同的故事。 – jckaos