在测试【兆易创新GD32H759I-EVAL开发板】过程中 遇到许多小坎坷
今天遇到的是
.\Objects\Project.axf: Warning: L6439W: Multiply defined Global Symbol OS_Tick_Enable defined in .text.OS_Tick_Enable(os_systick_1.o) rejected in favor of Symbol defined in .text.OS_Tick_Enable(os_systick.o).
.\Objects\Project.axf: Warning: L6439W: Multiply defined Global Symbol OS_Tick_Disable defined in .text.OS_Tick_Disable(os_systick_1.o) rejected in favor of Symbol defined in .text.OS_Tick_Disable(os_systick.o).
.\Objects\Project.axf: Warning: L6439W: Multiply defined Global Symbol OS_Tick_GetCount defined in .text.OS_Tick_GetCount(os_systick_1.o) rejected in favor of Symbol defined in .text.OS_Tick_GetCount(os_systick.o).
遇到 变量重复警告
一般是 针对重复的变量名 先搜索整个工程,然后排查 ,去重复
拿一个警告来分析
.\Objects\Project.axf: Warning: L6439W: Multiply defined Global Symbol OS_Tick_Enable defined in .text.OS_Tick_Enable(os_systick_1.o) rejected in favor of Symbol defined in .text.OS_Tick_Enable(os_systick.o).
这些警告信息指出您在项目中存在多个全局符号定义冲突。具体来说,像OS_Tick_Enable
、OS_Tick_Disable
等多个函数或变量在不同的源文件(os_systick_1.o
和os_systick.o
)中被定义了多次,链接器在链接过程中选择了其中一份定义,并忽略了另一份,以解决这个多重定义问题。这种情况虽然不会导致编译错误,但可能引发运行时错误,因为可能不是您期望的版本被链接器选择。
原因
- 相同函数或变量在不同源文件中的重复定义:这可能是因为您不小心将同一函数或变量的定义复制到了多个源文件中。
- 静态库或外部库中的重复定义:如果您链接了包含这些符号定义的多个静态库,也可能会出现这种警告。
- 源文件重复包含:在构建过程中,同一个源文件被多次编译到不同的目标文件中。
解决思路
- 检查和合并重复的定义:警告中提到了 很多变量 都在 os_systick_1.o,os_systick.o 中 重复定义,一般来说是先逐个 比较涉及到的重复定义的函数或变量。如果可能,将它们合并到一个共同的源文件中,或者确保每个符号只在一个源文件中定义。 经过搜索排查这些重名变量发现 系统确实包含了2个
os_systick.c
但是 区别是 一个位于 CMSIS 6.0 的路径下,一个位于 CMSIS RTOS 的路径下,
- 那么 之所以警告会出现 os_systick_1.o 是因为 存在了2个
os_systick.c 文件 ,编译器在编译时 自动给第二个 生成的.o文件 改成了
os_systick_1.o ,
应该保留哪个? 如何保留 ?
由于系统使用了 FreeRTOS ,所以 RTOS路径下的 不能少, 如何去掉 另一个多余的文件?
发现是 在配置RTE时 选择重复导致
勾选掉 这个选项 解决问题