2016-09-14 4 views
0

こんにちは、このプラットフォームが過去に私のために解決したすべての問題について、残念ながら私は解決できなかった問題を発見しました。C標準をc99に変更した後にUNIXのtime.hを使用した場合のエラー

私はcmakeには新しく、新しい実行可能ファイルといくつかのライブラリファイルでデモプロジェクトを展開しました。私はデモプロジェクトのコンパイルに問題はありません。しかし、私の新しいプロジェクトはc99標準でコンパイルする必要があり、突然、time.hのtimespec構造体を実装する際にエラーが発生します。これはデモプロジェクトでも使用されていますので、デモをc99で再度コンパイルしましたが、同じ問題があります。 GCCコンパイラとcmakeのバージョン私がカバーされるすべての必要な詳細を持っている2.8.7

希望を使用して、Ubuntuの上でこれを実行する

。そうでない場合は、事前に教えていただきありがとうございます!

敬具

編集#1:私は取得エラーメッセージ:
- 宣言されていない> CLOCK_MONOTONIC <(最初にこの関数で使用)
- フィールド 'tv_nsecは'
を解決できませんでした - フィールド " tv_secのは」
解決できませんでした - シンボル 'CLOCK_MONOTONIC' を解決することができませんでしたが
- 関数の暗黙的な宣言のための警告 'にclock_gettime'、 'にnanosleep'、 'timeradd'、 'timercmp'

編集#2:メイクとエラー出力は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をdefinining後の出力でした。 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 Makefileを作成することはできますが、実際のEclipseプロジェクトを作成することはできません。
これは別の問題であるため、このケースは閉鎖されており、皆さんのご協力と努力に感謝します。 man timeradd関数timeraddの定義は_DEFAULT_SOURCE機能テスト・マクロが定義されている場合にのみ使用可能であり、言うよう

+0

。 –

+0

申し訳ありませんが、それについては考えていませんでした。より多くの人々がそれを見ることができるようにオリジナルの投稿に追加しました。 – jckaos

+0

'cmake'には全く言及がありません。 'make VERBOSE = 1'と入力した後、gccによって報告されたエラーを単にコピー/ペーストしてください: – malat

答えて

0

man feature_test_macros_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 

説明は言う:

このマクロはすることができデフォルトの定義が無効になっている場合でも「デフォルト」の定義 が提供されるように定義されています。 個々のマクロが明示的に定義されているか、 コンパイラが "標準"モード(例えば、 cc -std = c99)のいずれかで呼び出されています。

だから、明示的timeradd-std=c99モードで利用可能メイク機能のため_DEFAULT_SOURCEマクロを定義する必要があります:あなたが得るエラーを共有してください

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

あなたの提案をありがとう。私はc99の代わりにgnu99を使って解決しました。 cmakeを使ってUNIX Makefileを生成すると、すべてうまく動作します。 Eclipseプロジェクトを生成しようとするとtimespecを解決できないというエラーはまだ出ていますが、それは私が推測する別の話です。 – jckaos

関連する問題