2015-09-19 7 views
5

Hier wird die minimale C-Programm zu reproduzieren:#including <alsa/asoundlib.h> und <sys/time.h> Ergebnisse in mehrfacher Definition Konflikt

#include <alsa/asoundlib.h> 
#include <sys/time.h> 

int main(void) 
{ 
} 

Das mit gcc -c -o timealsa.o timealsa.c kompilieren, aber wenn Sie schließen die -std=c99 Schalter, Sie erhält einen Neudefinition Fehler:

In file included from /usr/include/sys/time.h:28:0, 
       from timealsa.c:3: 
/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 timealsa.c:2: 
/usr/include/alsa/global.h:138:8: note: originally defined here 
struct timeval { 
     ^

Wie kann ich diesen Konflikt lösen, während immer noch -std=c99 mit?

+0

Sie sollten den Mindeststandard der Haupt verwenden, die ** int main (void) ist {return 0;} ** – Michi

+0

Ja, du hast Recht (aber das ist eine weitere Zeile!) – Lombard

+0

@Michi die 'return 0 ' ist implizit, wenn nicht in _C99_ vorhanden (Whcih ist diese Frage markiert). Siehe: http://stackoverflow.com/questions/4138649/why-is-return-0-optional. Die Lücke ist ein Problem obwohl –

Antwort

5

Da Ihre Frage darauf hinweist, dass Sie GLIBC time.h verwenden, gibt es eine Möglichkeit, dies zu vermeiden, indem Sie es nicht definieren timeval. Fügen Sie zunächst asoundlib.h ein und definieren Sie dann _STRUCT_TIMEVAL. Der in asoundlib.h definierte wird derjenige sein, der verwendet wird.

#include <alsa/asoundlib.h> 
#ifndef _STRUCT_TIMEVAL 
# define _STRUCT_TIMEVAL 
#endif 
#include <sys/time.h> 

int main(void) 
{ 
} 
+0

Das funktioniert - also was bringt 'std = c99' auf den Tisch, was uns dazu bringt, explizit die Zeitdefinition von sys/time zu deaktivieren? – Lombard

+3

@Lombard erzwingt die Einhaltung von Standards, daher sind Neudefinitionen illegal. Versuchen Sie 'std = c89', erhalten Sie das gleiche Ergebnis. –

+1

@Lombard: Ich habe eine kleine Änderung am Code vorgenommen, um _STRUCT_TIMEVAL nur zu definieren, wenn es nicht bereits definiert ist. Es gibt einige Warnoptionen wie "-Wall", die die Neudefinition der Definition als Problem aufgreifen können. –

1

Mit C99 und später können Sie keine doppelten Definitionen der gleichen Struktur haben. Das Problem ist, dass alsa/asoundlib.halsa/global.h enthält, die diesen Code enthält:

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

... 

#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 

So ist die Lösung Michael Petch wird nicht funktionieren - von der Zeit, die Sie alsa/asoundlib.h aufgenommen haben es schon zu spät ist. Die richtige Lösung ist zu definieren _POSIX_C_SOURCE (_POSIX_SOURCE ist veraltet). Es gibt weitere Informationen zu diesen Makros here und here.

Zum Beispiel könnten Sie versuchen -D_POSIX_C_SOURCE=200809L. wenn Sie das tun jedoch, dass Sie Fehler wie diese bekommen:

/usr/include/arm-linux-gnueabihf/sys/time.h:110:20: error: field ‘it_interval’ has incomplete type 
    struct timeval it_interval; 
        ^
/usr/include/arm-linux-gnueabihf/sys/time.h:112:20: error: field ‘it_value’ has incomplete type 
    struct timeval it_value; 
        ^
/usr/include/arm-linux-gnueabihf/sys/time.h:138:61: error: array type has incomplete element type 
extern int utimes (const char *__file, const struct timeval __tvp[2]) 
                  ^

Das ist alles ein großes Durcheinander von alten C-Code und Makro Wahnsinn. Der einzige Weg, wie ich es zum Laufen brachte, war aufzugeben und -std=gnu11 zu verwenden.