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 和 gnu-arm 编译器可以在同一个系统上共存吗?