找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15285|回复: 3
收起左侧

error: #256: invalid redeclaration of type name "s32" (declared at

[复制链接]
ID:82083 发表于 2015-6-9 02:18 | 显示全部楼层 |阅读模式
在编译时,遇到如下错误提示D:\Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h(26):error:  #256: invalid redeclaration of type name"s32" (declared at line 312 of"D:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h")让菜鸟我很是头痛,找了好多网页解决不了问题,最后浏览到了51hei给的提示:
重复定义了。
估计你包含了stm32f10x_lib.h又包含了stm32f10x.h,导致这个情况。
这两个,你只能选一个的。
这样我开始了,艰苦的寻找在哪里包含了这两个文件,在主函数里发现了stm32f10x.h头文件,如下所示


抱着试试看的心态把stm32f10x.h头文件,更改为stm32f10x_lib.h头文件,竟然没错了。
开心,仅为像我一样的菜鸟提供一个解决方法。

解决方案1.1:
关于stm32f103报错:error: #256: invalid redeclaration of type name"s32",我也来说两句吧。
这个具体来说是因为引用了自己建的固件库,但是没有配置路径,要把工程的路径配置为当前文件夹,
可以在keil里面建好的工程里,右击target 1,点击第一个选项“option for targer"targer 1"”,在"C/C++"选项卡里的“Include Paths”一栏里加入你当前自己编辑的固件库路径,我这边的是“.\SRC;.\Libraries\STM32F10x_StdPeriph_Driver\inc;.\Libraries\CMSIS\Core\CM3”,大家可以参考一下,这里面有里有3个文件夹,输入好后,按“ok”按钮,重新编译下,应该就可以了。



解决方案2:
将新版本的库 全部复制
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc
粘贴到MDK安装目录就能解决
C:\Keil\ARM\INC\ST\STM32F10x



解决方案3:
在ST官网上下的固件包,用STM32F10x_StdPeriph_Lib_V3.4.0/Project/STM32F10x_StdPeriph_Template里的工程,编译正确。以下尝试了两种新建工程的方法,均失败:
1。 将固件包里的例程和相应的CMSIS、StdPeriph_Driver拷到工程下,修改target options里的C/C++ include paths项为“../;../Src/App;../Src/CMSIS;../Src/Lib”,编译报错“D:/Keil/ARM/INC/ST/STM32F10x/stm32f10x_type.h(23): error: #256: invalid redeclaration of type name "s32" (declared at line 470 of "Src/App/stm32f10x.h")”等。

2。 若在工程中添加的文件为固件包中的链接(而不是拷贝),完全按照template里的结构,并将include paths按照template进行修改,编译报错“Keil/ARM/INC/ST/STM32F10x/stm32f10x_conf.h(147): warning: #47-D: incompatible redefinition of macro "HSE_Value" (declared at line 511 of "STM32F10x_StdPeriph_Lib_V3.4.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h")”等。

KEIL安装目录下的为旧版lib,工程中使用的为新版,两者代码结构上有所不同。而编译器在编译了工程文件的同时,自动链接了KEIL安装目录下的文件,造成冲突。但是在选项中没有找到配置是否链接KEIL安装目录下LIB的地方。



问题原理:

对照固件包中模板工程的链接情况,逐个对比模板工程和自建工程中,各源代码链接的所需库的位置。若模板中链接的是固件包中的文件,如system_stm32f10x.h 或 stm32f10x_config.h,即新版lib;而自建工程中链接的相应文件位置为Keil安装目录,说明工程设置中没有包含该库的路径,使编译器自动寻找安装目录中的旧版文件。由于库代码结构不同,造成编译错误。因此需要在工程设置的include paths栏中添加新版lib的路径。

问题解决:

对于第二种建立工程的步骤,通过报错的信息很容易看出,编译过程链接了keil安装目录下的conf.h,而实际需要使用固件包中的该文件。因此,在include paths中添加固件包conf.h所在目录,即可解决问题。

对于第一种建立工程的步骤,stm32f10x_type.h不是工程源代码中直接需要包含和应用的头文件,不容易找到未设定的链接路径。因此,采用“问题原理”中的办法,逐一链接库对比,修改链接路径,也可以找到未包含的位置,解决问题。

还需要注意区分的是,路径中的“../”意为工程文件上一级目录,“./”为工程文件的同级目录。我们在一些论坛上看到别人贴的自己的路径中,第一个即为"../",不是必须的。另外,编译器只能在当前目录下搜索文件,不会进入下一级目录,因此指定的路径需要很具体。



出现这个问题时,搜了不少论坛,也在论坛上问过大牛,大致都是配置路径有问题,却没有说到具体的解决办法,自己摸索了好一阵。的确是这个原因,以后如果我遇到相同的提问,估计也会是这么回答。不过,理论和具体实践还是有距离的。

回复

使用道具 举报

ID:96365 发表于 2015-11-19 15:53 | 显示全部楼层
very good
回复

使用道具 举报

ID:232020 发表于 2017-9-19 09:56 | 显示全部楼层
正在被这个问题困扰中
回复

使用道具 举报

ID:316288 发表于 2018-4-25 15:34 | 显示全部楼层
我的工程也报了一个 int16_t的重定义,查明是以下语句导致;
#include "stdio.h"


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表