编译报"const void *" is incompatible with parameter of type "const float *",跟gcc版本相关

error :

/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9220): error: argument of type "const void *" is incompatible with parameter of type "const float *"

/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9231): error: argument of type "const void *" is incompatible with parameter of type "const float *"

/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9244): error: argument of type "const void *" is incompatible with parameter of ty
。。。

。。。

。。。

解决方法:

sudo apt-get install gcc-4.9 g++-4.9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
sudo update-alternatives --config gcc

或者你已经有多个gcc版本了,直接用第三条命令切换gcc版本即可

<think>好的,我现在需要解决用户在ARMCC编译器中遇到的错误147-D,具体是关于_vsnprintf函数声明不兼容的问题,出现在lv_printf.c文件中,使用的开发环境是MDK_F103。首先,我得理解这个错误的根本原因。 用户提供的引用内容提到,类似错误可能是由于头文件中声明变量或函数时缺少分号,但当前的问题是关于函数声明不兼容,所以可能涉及到函数原型不一致的情况。根据错误代码147-D的描述,通常当函数的前向声明与实际定义或库中的声明不一致时会发生这种错误。 接下来,我需要考虑_vsnprintf函数的标准声明是什么样的。标准库中,vsnprintf的函数原型通常是这样的:int vsnprintf(char *buffer, size_t count, const char *format, va_list arg);。如果用户代码中的声明与这个原型不匹配,就会导致错误。例如,可能参数类型或数量不一致,或者返回类型不同。 用户提到错误出现在lv_printf.c文件中,所以需要检查该文件中是否有对_vsnprintf的自定义实现或声明。可能存在的情况是,用户或某个库中重新定义了_vsnprintf,但与ARMCC编译器内置的版本冲突。例如,如果用户代码中声明为void _vsnprintf(...),而标准库中返回int,就会导致不兼容。 此外,检查是否在头文件中进行了不正确的函数声明,或者是否包含了不兼容的头文件。例如,是否有某个头文件使用了不同的参数类型,或者在C和C++混合编译时,没有正确使用extern "C"导致名称修饰不一致。 还要考虑编译器特定的行为。ARMCC可能有自己的实现或宏定义覆盖了标准函数,比如是否启用了某些宏(如__MICROLIB)导致库函数被替换,从而引发原型不匹配。 解决方案可能包括:确保函数声明与标准库一致,使用条件编译指令来避免重复定义,或者使用编译器选项来忽略特定警告。另外,如果用户确实需要自定义_vsnprintf,可能需要使用宏来重命名函数,避免与库函数冲突。 在实施具体步骤时,用户需要检查lv_printf.c中的相关代码,查看所有涉及到_vsnprintf的地方,确保声明和定义与标准库一致。同时,检查项目中的头文件,确认没有重复声明或错误声明。如果存在自定义实现,可能需要调整参数或返回类型,或者使用预处理器指令来条件编译。 最后,建议用户使用编译器的文档来查找错误147-D的具体说明,确认问题的根源,并根据建议进行调整。此外,参考MDK的官方文档或社区讨论,可能会有针对此错误的特定解决方案。</think>### ARMCC error 147-D 解决方案 #### 错误分析 错误`147-D: incompatible declaration of _vsnprintf`表明函数`_vsnprintf`的**声明与标准库或现有定义冲突**。可能原因包括: 1. 自定义实现与标准库声明不一致 2. 头文件中存在重复/错误声明 3. 编译器库配置冲突(如使用微库`MicroLib`) #### 逐步解决方案 1. **检查函数声明一致性** - 标准库原型为: $$int \_vsnprintf(char *buffer, size\_t count, const char *format, va\_list arg);$$ - 在`lv_printf.c`中检查自定义实现是否匹配参数类型和返回值 - 若使用自定义实现,建议添加条件编译: ```c #ifndef __ARMCC_VERSION // 自定义实现 #endif ``` 2. **处理微库兼容性问题** - 若启用`MicroLib`(常见于MDK低内存配置),需显式声明: ```c #include <stdarg.h> int _vsnprintf(char *s, size_t n, const char *format, va_list arg); ``` - 或关闭微库:`Project -> Options -> Target -> Use MicroLIB`取消勾选[^2] 3. **屏蔽编译器内置声明** - 在包含标准库头文件前添加宏定义: ```c #define _vsnprintf __armcc_vsnprintf #include <stdio.h> ``` 4. **强制类型匹配(终极方案)** ```c #if defined(__ARMCC_VERSION) #define _vsnprintf(s,n,fmt,args) __vsnprintf(s,n,fmt,args) #endif ``` #### 验证流程图 ```mermaid graph TD A[出现147-D错误] --> B{是否自定义_vsnprintf?} B -->|是| C[检查参数/返回值类型] B -->|否| D[检查库配置] C --> E[添加条件编译保护] D --> F{使用MicroLib?} F -->|是| G[显式声明函数原型] F -->|否| H[检查标准头文件包含顺序] ``` #### 相关问题 1. 如何判断MDK工程是否启用了MicroLib? 2. ARMCC与GCC编译器在函数声明上有哪些差异? 3. 如何解决C语言中的符号重复定义错误? [^1]: 头文件错误声明可能导致编译器误报错误行号 [^2]: MDK微库配置可能改变标准函数实现方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值