stm32_之【errors】重定义错误 Symbol Key_GPIO_Config multiply defined (by key.o and main.o).

编译失败:在轮询点灯中,编写完main.c、led.c、key.c文件之后,进行最后一步,编译工程,出现如下错误,在编译器编译key.c时输出的key.o文件和编译main.c时输出的main.o文件中,有函数重复定义了,分别是:delay_ms()延时函数、Key_GPIO_Config()按键引脚配置函数、KeyScan()按键扫描函数:



发现错因:在main.c中include了key.c文件



尝试解决:通过问郭工知道了,在导入库时不能include XXX.c 文件,这样做等价于把key.c整篇复制到main.c中,于是,我在main.c中把#include"key.c"这行代码删除,观察编译结果,是否去除了多了的函数,发现很多东西没有定义(未定义)





进一步检查错因:

没有编写key.h文件,无法与main.c进行include库链接

因为main.c中要调用这三个函数,即:delay_ms()延时函数、Key_GPIO_Config()按键引脚配置函数、KeyScan()按键扫描函数。调用函数前要定义函数,很显然这三个函数定义在key.c中,已经确定了函数定义的位置,然后要把三个函数调用到另一个C文件即main.c中,就要声明函数,那么应该在哪里声明函数呢?

应该在定义函数的key.c文件对应的key.h文件声明函数、声明常量,比如KEY_OFF置1都应该写在key.h文件中。然后再在目的地main.c中#include key.h文件,就能将main.c编译成功,不会出现重定义,也不会出现未定义了。


1.函数定义处:





2.函数声明处:



3.函数调用处:



编写key.h文件

#ifndef  __文件名_H_

#define  __文件名_H_



#define  要调用的.c中的常量  对应值

extern void 要调用的。c中的函数(void);



#endif




猜你喜欢

转载自blog.csdn.net/luoyir1997/article/details/80217403
今日推荐