在几个标题中重新定义'struct timeval'

时间:2017-04-06 12:52:52

标签: c alsa redefinition intel-edison libalsa

我有几个问题要编译一个C程序,以便将声音从英特尔Edison传输到设备(iOS和Android)。

我做了一个C程序: 我在我的程序中使用alsa / asoundlib.h和pthread.h我不包含sys / time.h,因为ALSA不允许这样做。

我在我的程序中使用了很多timeval,当我在我的计算机上编译它时我编译得很好,但在我的爱迪生时我:

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

如何设法停止这些重定义? 谢谢你的帮助!

额外信息:

我包括:

#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,没有任何反应

1 个答案:

答案 0 :(得分:2)

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应该依赖系统的定义,而不是发布自己的,重复的定义。