STM CubeIDE 1.9.0 有链接器问题?

STM CubeIDE 1.9.0 has linker issues?

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 似乎把链接器弄乱了。任何人都可以确认此行为,还是只有我受到影响?

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

GCC 10 support by default

来自GCC 10 release notes

GCC now defaults to -fno-common. As a result, global variable accesses are more efficient on various targets. In C, global variables with multiple tentative definitions now result in linker errors. With -fcommon such definitions are silently merged during linking.

This page 有进一步的解释和解决方法:

A common mistake in C is omitting extern when declaring a global variable in a header file. If the header is included by several files it results in multiple definitions of the same variable. In previous GCC versions this error is ignored. GCC 10 defaults to -fno-common, which means a linker error will now be reported. To fix this, use extern in header files when declaring global variables, and ensure each global is defined in exactly one C file. If tentative definitions of particular variables need to be placed in a common block, __attribute__((__common__)) can be used to force that behavior even in code compiled without -fcommon. As a workaround, legacy C code where all tentative definitions should be placed into a common block can be compiled with -fcommon.

在 Project > Properties > C/C++ build > Settings > gcc compiler > miscellaneous > Other flags 中,尝试如下所示添加 -fcommon 以避免 STM CubeIDE 1.9 的 1k+ 链接器错误问题.