您尚未登录。

楼主 #1 2020-12-07 08:55:15

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

在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;
};

离线

楼主 #2 2020-12-07 10:17:22

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

https://www.cnblogs.com/htsky/p/5936703.html
搜到这么篇文章,也是遇到类似问题,他是解决了,但是没看明白问题原因。

离线

楼主 #3 2020-12-07 15:23:12

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

我尝试建了个新的单片机mdk工程,通过编译后,我又新加入了2个.h文件,其中一个.h文件里声明的一个结构体里,用到了另一个头文件里声明的结构体。结果编译报同样的错误。
但是我看工程里用到很多头文件里新声明的结构体里,用到类似struct rt_device这样的结构体,却没有报错。

---------------------------------------------------------

报同样的错误,是因为我没有把两个.h文件所在路径加入mdk头文件路径里,加入后,没错误了。
这么看,原报错工程,有可能是头文件路径的问题?

---------------------------------------------------------

但是我又将audio.h和audio_pipe.h的路径加入到mdk的头文件路径列表里,结果还是报一样的错。

最近编辑记录 Gentlepig (2020-12-07 16:07:17)

离线

#4 2020-12-07 16:09:02

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 446
积分: 313.5
个人网站

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

感觉你不是用scons生成的工程,没有添加 include path.

而是把xx.h直接添加到mdk中,然后希望可以不用设置 include path.

离线

楼主 #5 2020-12-07 16:55:00

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

aozima 说:

感觉你不是用scons生成的工程,没有添加 include path.

而是把xx.h直接添加到mdk中,然后希望可以不用设置 include path.


是用scons生成的工程。

-----------------------------------

硬件是新塘的m487开发板,尝试了bsp/nuvoton下的两个bsp,都卡在了这个错误上。

-----------------------------------

尝试想关闭音频这个功能,也没搞成功...

最近编辑记录 Gentlepig (2020-12-07 17:43:49)

离线

楼主 #6 2020-12-08 11:55:35

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

就在这个工程里,新建两个头文件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)

离线

楼主 #7 2020-12-08 17:19:52

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

折腾了快2天了,还是通不过编译。放弃。
想办法关掉audio部分,找了半天,最后要先关闭i2s,才能关闭audio。
现在可以通过编译了。

离线

楼主 #8 2020-12-09 09:35:08

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

去gitee上下了份,结果编译没问题。
而我之前是github上下载的。
竟然不同步...

-------------------------------------

看了components/drivers/aduio目录下的几个文件,竟然是github上是新的。

最近编辑记录 Gentlepig (2020-12-09 09:40:21)

离线

楼主 #9 2020-12-09 10:25:05

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

aozima 说:

感觉你不是用scons生成的工程,没有添加 include path.

而是把xx.h直接添加到mdk中,然后希望可以不用设置 include path.


尝试了几遍,发现了有点不同。
components/drivers/audio目录下的aduio_pipe.c文件里,我之前从github上下载的,没有包含rtdevice.h头文件,加上后就能通过编译,但该文件下的#include "audio_pipe.h"里,已经包含了rtdevice.h了啊。

QQ截图20201209102044.jpg
QQ截图20201209102137.jpg

离线

楼主 #10 2020-12-09 10:34:35

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

audio.h包含了audio_pipe.h,audio_pipe.h里面包含了rtdevice.h,rtdevice.h又包含了audio.h

rtt群里一位朋友的话。头文件循环包含依赖。
不过还是不明白为什么会报错,不是有#ifndef吗?

离线

楼主 #11 2020-12-09 16:29:10

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,200
积分: 1140.5

Re: 编译rt-thread的audio.c文件报错,请大家帮看下错在哪里?

一位朋友解释了下,audio.h里用到了audio_pipe.h里定义的结构体,虽然audio.h里#include "audio_pipe.h"了,但因为aduio_pipe.h里有#ifndef __AUDIO_PIPE_H__,并且,已经在其它地方调用过一次了。所以没有在audio.h里展开,这样audio.h里就缺少了那个结构体定义。

好像是这个样子的。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn