STM CubeIDE 1.9.0 有链接器问题吗?

Chr*_*s_B 1 stm32 stm32cubeide

Prolog:我正在使用 STM32 CubeIDE 为 STM32 微控制器开发嵌入式应用程序,例如 F1 系列、F4 系列、G0 系列和其他一些使用 C 语言的控制器。

发生了什么:今天早上,自动更新功能建议我更新到 STM CubeID 版本 1.9.0,我接受了。更新程序完成后,我打开当前项目并更改 typedef 结构中的一个变量,然后单击“构建”按钮。突然,链接器报告了很多“多重定义”和“首先在此处定义”错误。该项目昨天使用 CubeIDE 1.8 版本完美编译,没有任何问题

经过一两个小时的搜索后,我可能错过了一个分号或其他方向的东西,这可能会弄乱整个代码,我得出的结论是,从 CubeIDE 1.8.0 升级到 1.9.0 可能是根源导致此错误的原因。

所以我决定卸载 CubeIDE 1.9.0 并重新安装版本 1.8.0,将项目回滚到昨天晚上的最后一个工作版本(使用 1.8.0 编译),进行相同的更改,瞧!- 一切又恢复正常了。

对我来说,STM 似乎把链接器弄乱了。任何人都可以证实这种行为,还是只有我受到影响?

Arm*_*das 5

这是由于编译器更新造成的。来自STM32CubeIDE的发行说明:

默认支持 GCC 10

来自GCC 10 发行说明

GCC 现在默认为 -fno-common。因此,全局变量访问在各种目标上更加高效。在 C 中,具有多个暂定定义的全局变量现在会导致链接器错误。使用 -fcommon 时,此类定义会在链接期间以静默方式合并。

此页面有进一步的解释和解决方法:

C 中的一个常见错误是在头文件中声明全局变量时省略 extern。如果标头被多个文件包含,则会导致同一变量有多个定义。在以前的 GCC 版本中,此错误被忽略。GCC 10 默认为 -fno-common,这意味着现在将报告链接器错误。要解决此问题,请在声明全局变量时在头文件中使用 extern,并确保每个全局变量都在一个 C 文件中定义。如果需要将特定变量的临时定义放置在公共块中, __attribute__((__common__))则即使在未使用 -fcommon 编译的代码中也可用于强制该行为。作为一种解决方法,可以使用 -fcommon 来编译旧版 C 代码(所有暂定定义都应放入公共块中)。