在audio.h里有结构体声明:
struct rt_audio_record
{
struct rt_audio_pipe pipe;
rt_bool_t activated;
};
编译时报错:
compiling audio_pipe.c...
..\..\..\components\drivers\include\drivers/audio.h(150): error: #70: incomplete type is not allowed
struct rt_audio_pipe pipe;
..\..\..\components\drivers\audio\audio_pipe.c: 0 warnings, 1 error
而audio_pipe是在audio_pipie.h里声明的:
struct rt_audio_pipe
{
struct rt_device parent;
/* ring buffer in pipe device */
struct rt_ringbuffer ringbuffer;
rt_int32_t flag;
/* suspended list */
rt_list_t suspended_read_list;
rt_list_t suspended_write_list;
struct rt_audio_portal_device *write_portal;
struct rt_audio_portal_device *read_portal;
};
离线
https://www.cnblogs.com/htsky/p/5936703.html
搜到这么篇文章,也是遇到类似问题,他是解决了,但是没看明白问题原因。
离线
我尝试建了个新的单片机mdk工程,通过编译后,我又新加入了2个.h文件,其中一个.h文件里声明的一个结构体里,用到了另一个头文件里声明的结构体。结果编译报同样的错误。
但是我看工程里用到很多头文件里新声明的结构体里,用到类似struct rt_device这样的结构体,却没有报错。
---------------------------------------------------------
报同样的错误,是因为我没有把两个.h文件所在路径加入mdk头文件路径里,加入后,没错误了。
这么看,原报错工程,有可能是头文件路径的问题?
---------------------------------------------------------
但是我又将audio.h和audio_pipe.h的路径加入到mdk的头文件路径列表里,结果还是报一样的错。
最近编辑记录 Gentlepig (2020-12-07 16:07:17)
离线
感觉你不是用scons生成的工程,没有添加 include path.
而是把xx.h直接添加到mdk中,然后希望可以不用设置 include path.
是用scons生成的工程。
-----------------------------------
硬件是新塘的m487开发板,尝试了bsp/nuvoton下的两个bsp,都卡在了这个错误上。
-----------------------------------
尝试想关闭音频这个功能,也没搞成功...
最近编辑记录 Gentlepig (2020-12-07 17:43:49)
离线
就在这个工程里,新建两个头文件a.h,b.h。a.h里声明了个结构体,b.h里也声明了个结构体,结构体里用到了a.h里声明的结构体。编译后,这里没报错。
我在audio_pipe.h里又新声明了个结构体,在b.h里用到了这个新声明的结构体,结果编译时,也报incomplete type is not allowed这个错误。
感觉像是audio_pipe.h这个头文件没包含进到工程里,但看工程头文件路径,是包含了的。而且编译后点开.c文件旁边的那个加号,是可以看到audio_pipe.h这个文件的,也能跳转过去。
如果把报错时,提到的audio_pipe.h里那个结构体,复制到audio.h或b.h里,再编译会报重复定义的错误。
奇了怪了。
--------------------------------------
尝试将audio_pipe.h移到其它目录,结果一样。
最近编辑记录 Gentlepig (2020-12-08 12:02:37)
离线
折腾了快2天了,还是通不过编译。放弃。
想办法关掉audio部分,找了半天,最后要先关闭i2s,才能关闭audio。
现在可以通过编译了。
离线
去gitee上下了份,结果编译没问题。
而我之前是github上下载的。
竟然不同步...
-------------------------------------
看了components/drivers/aduio目录下的几个文件,竟然是github上是新的。
最近编辑记录 Gentlepig (2020-12-09 09:40:21)
离线
感觉你不是用scons生成的工程,没有添加 include path.
而是把xx.h直接添加到mdk中,然后希望可以不用设置 include path.
尝试了几遍,发现了有点不同。
components/drivers/audio目录下的aduio_pipe.c文件里,我之前从github上下载的,没有包含rtdevice.h头文件,加上后就能通过编译,但该文件下的#include "audio_pipe.h"里,已经包含了rtdevice.h了啊。
离线
audio.h包含了audio_pipe.h,audio_pipe.h里面包含了rtdevice.h,rtdevice.h又包含了audio.h
rtt群里一位朋友的话。头文件循环包含依赖。
不过还是不明白为什么会报错,不是有#ifndef吗?
离线
一位朋友解释了下,audio.h里用到了audio_pipe.h里定义的结构体,虽然audio.h里#include "audio_pipe.h"了,但因为aduio_pipe.h里有#ifndef __AUDIO_PIPE_H__,并且,已经在其它地方调用过一次了。所以没有在audio.h里展开,这样audio.h里就缺少了那个结构体定义。
好像是这个样子的。
离线