2017-04-06 67 views
0

我有幾個問題需要編譯一個C程序來將聲音從Intel Edison傳輸到設備(iOS和Android)。在幾個頭文件中重新定義'struct timeval'

我做了一個C程序: 我在我的程序中使用alsa/asoundlib.h和pthread.h我沒有包含sys/time.h,因爲ALSA不允許這樣做。

我用很多的timeval在我的程序,當我編譯它在我的電腦上i'ts編譯好的,但在我的愛迪生當我:

gcc -std=c99 -Wall -O0 -ggdb -o sender sender.c spsc_circular_queue.c -lopus -lasound -lpthread 


In file included from /usr/include/alsa/asoundlib.h:49:0, 
       from sender.c:16: 
/usr/include/alsa/global.h:145:8: error: redefinition of 'struct timespec' 
struct timespec { 
     ^
In file included from /usr/include/alsa/global.h:34:0, 
       from /usr/include/alsa/asoundlib.h:49, 
       from sender.c:16: 
/usr/include/time.h:120:8: note: originally defined here 
struct timespec 
     ^
In file included from /usr/include/time.h:41:0, 
       from /usr/include/sched.h:34, 
       from sender.c:18: 
/usr/include/bits/time.h:30:8: error: redefinition of 'struct timeval' 
struct timeval 
     ^
In file included from /usr/include/alsa/asoundlib.h:49:0, 
       from sender.c:16: 
/usr/include/alsa/global.h:140:8: note: originally defined here 
struct timeval { 
     ^
Makefile:16: recipe for target 'sender' failed 
make: *** [sender] Error 1 

如何管理,制止這些redifinitions?! 謝謝你的幫助!

額外的信息:

我包括:

#include <assert.h> 
#include <stdbool.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <unistd.h> 
#include <alloca.h> 
#include <limits.h> 
#include <inttypes.h> 
#include <alsa/asoundlib.h> 
#include "../opus/include/opus.h" 
#include <pthread.h> 
#include "spsc_circular_queue.h" 

我刪除sched.h中,沒有發生

+0

您在第18行的sender.c中包含'/ usr/include/sched.h',其中包含'/ usr/include/time.h'。 – mch

+0

更改內容不包括: – maathor

+0

您已經做過##包括',它包含'#include '。那就是問題所在。如果你刪除了'#include ',錯誤信息將會改變,以引導你到下一個問題。 – mch

回答

1

ALSA取決於類型struct timespecstruct timeval。它global.h頭,因此適當地做到這一點:

/* for timeval and timespec */ 
#include <time.h> 

然而,這似乎是GLIBC定義,只有當一個適當的功能測試宏已經被定義,因爲這頭還表示,這些結構的意見:

#ifdef __GLIBC__ 
#if !defined(_POSIX_C_SOURCE) && !defined(_POSIX_SOURCE) 
struct timeval { 
    time_t  tv_sec;  /* seconds */ 
    long  tv_usec; /* microseconds */ 
}; 

struct timespec { 
    time_t  tv_sec;  /* seconds */ 
    long  tv_nsec; /* nanoseconds */ 
}; 
#endif 
#endif 

很難確定在什麼情況下GLIBC實際上並宣佈通緝結構。它確實有條件地這樣做,但看起來至少在GLIBC v2.17中,條件比ALSA假定的條件更一般。因此ALSA似乎已經與GLIBC失去同步,如果它確實是完全同步的,並且在某些情況下它會產生你遇到的重複聲明問題。

你最好的辦法是在編譯時定義the _POSIX_C_SOURCE macro。 GLIBC支持的值記錄在鏈接的手冊頁上。任何值,除了可能爲0,都應該爲您解決問題,但效果會更廣泛,因此您可能需要嘗試不同的值。首先,我建議的價值200809L,這是GLIBC支持的值中最具包容性的:那麼

gcc -D_POSIX_C_SOURCE=200809L -std=c99 -Wall -O0 -ggdb -o sender sender.c spsc_circular_queue.c -lopus -lasound -lpthread 

ALSA應該依賴於系統的定義,而不是頒發自己,重複者。

+0

Woww!謝謝 !我會更好地理解它,我的程序編譯! – maathor

+0

不幸的是,這不起作用,至少對我來說,你會在'time.h'中得到一些關於'it_interval'和'it_value'類型不完整的錯誤。 – Timmmm