将ASN1C生成代码从PC移植到STM32(ARM)时遇链接错误
解决Keil中__stdin/__stdout重复定义的链接错误
问题根源
链接错误显示stdio_streams.o和utils_stm32.o两个目标文件都定义了__stdin和__stdout符号,导致冲突。该问题和ASN1C生成的代码无关,是项目中现有文件的标准IO符号重复定义导致。
具体修复方案
方案1:修改自定义工具文件的符号声明
打开utils_stm32.c,查找其中__stdin和__stdout的定义代码,通常类似:
FILE __stdin; FILE __stdout;
将其改为外部声明,避免重复定义:
extern FILE __stdin; extern FILE __stdout;
方案2:排除冗余文件的编译
如果其中一个文件的标准IO实现是多余的:
- 打开Keil项目管理器,找到冲突文件(
stdio_streams.c或utils_stm32.c) - 右键该文件,选择
Options for File... - 在
Properties标签页中取消勾选Include in Build,跳过该文件的编译
方案3:调整编译器标准库配置
ARMCC编译器的标准库选项可能自带标准IO符号定义:
- 打开项目
Options for Target... - 切换到
Target标签页,切换Use MicroLIB的勾选状态(勾选/取消),尝试解决冲突 - 检查
Editor->Configuration中的标准库路径,确保无重复引用
方案4:重新生成ASN1C代码时禁用标准IO依赖
重新生成ASN1C代码时添加-no-stdio参数,禁止生成依赖标准IO的代码,避免引入额外的标准IO符号。
内容的提问来源于stack exchange,提问作者Pablo Vicedo
相关产品推荐
相关产品推荐

