我使用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
我该怎么做?
答案 0 :(得分:1)
链接器的-l
选项的约定(比如你给-lMyLib.a
作为链接器选项)是搜索一个前缀为给定名称的“lib
”的库文件并附加.a
(或.so
),即您的命令行搜索文件libMyLib.a.{a,so}
,这可能不是它的名称。
您可以根据此约定重命名库,也可以将其提供给链接器命令行,省略-l
(假设您的IDE允许这样做)。
答案 1 :(得分:1)
我之前遇到过同样的问题。
-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
答案 2 :(得分:0)
问题出现在-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
<强>更新强>
虽然它可能会解决问题但事实并非如此:
-llibrary
-l library
... 通常,以这种方式找到的文件是库文件 - 归档文件,其成员是目标文件。链接器通过扫描存档文件来处理存档文件,以查找已定义但尚未定义的符号的成员。但是,如果找到的文件是普通的目标文件,则以通常的方式链接。使用-l选项和指定文件名之间的唯一区别是-l使用'lib'和'.a'包围库并搜索多个目录。