STM32 Eclipse + ARM GNU 工具链错误链接器

Posted

技术标签:

【中文标题】STM32 Eclipse + ARM GNU 工具链错误链接器【英文标题】:STM32 Eclipse + ARM GNU toolchain error linker 【发布时间】:2015-07-01 05:28:32 【问题描述】:

我使用 Eclipse + ARM 插件来构建我的项目。当我需要在我的项目中使用 StemWin 库时,我将我的 IDE 配置为使用外部库。

我设置 首选项 -> C/C++ 常规 -> 路径和符号

我在“库路径”中添加了指向我的文件夹的链接包括库。 我还在“图书馆”选项卡中添加了我的图书馆的名称。 我检查了编译器选项卡中的设置,并确定一切都应该很好。 当我尝试构建我的项目时,链接器出现错误:

cannot find -lMyLib.a   Hello           C/C++ Problem

我仔细检查了我的库和链接的名称,一切都是正确的。这是我的链接器的输出:

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -L"C:\lib" 
-T"C:\arm_toolchain\stm32_workspace\Hello\LinkerScript.ld" -Wl,
-Map=output.map -Wl,--gc-sections -o "Hello.elf" @"objects.list" -lMyLib.a

我应该从这里做什么?

【问题讨论】:

【参考方案1】:

看起来问题出在 -lMyLib.a,这意味着您正在尝试将静态库链接为动态库。

要链接静态库,您必须像使用普通 .o 文件一样使用其路径:... /path/to/MyLib.a

生成的命令行应该类似于

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -L"C:\lib" -T"C:\arm_toolchain\stm32_workspace\Hello\LinkerScript.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "Hello.elf" @"objects.list" /path/to/MyLib.a

更新:

虽然它可能会解决问题,但事实证明并非如此:

-图书馆

-l 库

... 通常以这种方式找到的文件是库文件——其成员是目标文件的归档文件。链接器通过扫描归档文件来处理归档文件,其中的成员定义了迄今为止已被引用但尚未定义的符号。但是如果找到的文件是一个普通的目标文件,它会以通常的方式链接。使用 -l 选项和指定文件名的唯一区别是 -l 用“lib”和“.a”包围库并搜索多个目录。

(https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)

【讨论】:

这与“静态”或“动态”库无关。 -l 的约定对两者都是相同的。【参考方案2】:

链接器的-l 选项的约定(假设您将-lMyLib.a 作为链接器选项)是搜索在给定名称前附加“lib”和.a(或.so) 附加,即您的命令行搜索文件libMyLib.a.a,so,这可能不是它的命名方式。

您要么根据此约定重命名库,要么将其提供给链接器命令行,省略 -l(前提是您的 IDE 允许这样做)。

【讨论】:

【参考方案3】:

我之前也遇到过同样的问题。

-l:STemWin526_CM4_GCC.a  
-L"C:\Edu_Workspace\STM32F4\stm32f4_bsp_template\Drivers\Middlewares\ST\STemWin\Lib"  

以上是我的工作设置。

对于-l:<archive file name>,冒号: 对存档文件链接很重要。

-L 将包含库路径。 同样对于stemwin,请确保使用硬件浮点进行编译

-mfloat-abi=hard -mfpu=fpv4-sp-d16

【讨论】:

以上是关于STM32 Eclipse + ARM GNU 工具链错误链接器的主要内容,如果未能解决你的问题,请参考以下文章

编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]

STM32 CubeMX/GNU/Eclipse-Toolchain Retargeting(newlib 和 libgloss)

GNU ARM - 未找到 nano.specs

gnu 和 gnu-arm 编译器可以在同一个系统上共存吗?

由于在 IAR 工作台中使用 GNU ARM 工具链而导致的错误

ARM (STM32fxx) 的 OpenOCD (Olimex) 最终启动序列出错