[STM32F4] 对自定义静态库的未定义引用

[复制链接]
梧桐uuu 发表于 2025-8-22 17:40 | 显示全部楼层 |阅读模式
本帖最后由 梧桐uuu 于 2025-8-21 22:36 编辑

对自定义静态库的未定义引用。由于目前存在供货问题,我一直在使用同系列STM32F4xx的三种不同微控制器进行开发。将硬件特定的代码分别限制在它们各自的项目中(每种处理器对应三个项目)。但我有一些所有这三个项目都会用到的公共代码。

为了解决这个问题,我创建了一个配置为静态库的自定义STM32项目,用于存放所有这些公共代码。该项目编译正常并生成了 .a 文件,主项目也能正常找到并链接该库。但问题出现在链接阶段,提示库中的函数存在未定义引用。

在主项目的设置 -> C/C++ 构建 -> 设置中,于“工具设置”选项卡下,在“MCU GCC 链接器”->“库”部分,我已链接了该库以确保能找到并链接 .a 文件。

我想知道如何创建静态库,并且在编译和链接时没有遇到任何未定义引用的问题?

公羊子丹 发表于 2025-8-24 07:27 | 显示全部楼层
先确认一下,你在主工程里有把库的头文件路径加到包含路径里吗?否则编译器虽然能看到声明,但链接器找不到实现。
周半梅 发表于 2025-8-24 07:28 | 显示全部楼层
.a 库里必须包含对象文件,检查下是不是因为编译优化导致函数没被导出。
帛灿灿 发表于 2025-8-24 07:29 | 显示全部楼层
链接顺序也很重要,库要放在引用它的目标文件之后,不然会报未定义引用。
童雨竹 发表于 2025-8-24 07:30 | 显示全部楼层
你在 CubeIDE 里加库的时候,除了库名,还要加上库搜索路径,否则可能找不到正确的 .a。
万图 发表于 2025-8-24 07:30 | 显示全部楼层
建议用 arm-none-eabi-nm 工具检查一下 .a 文件里到底有没有你写的函数符号。
Wordsworth 发表于 2025-8-24 07:31 | 显示全部楼层
如果库项目里函数是 static 或 inline 的,那编译成 .a 时不会导出,主项目就会链接失败。
Bblythe 发表于 2025-8-24 07:32 | 显示全部楼层
有些时候需要在链接器参数里加 --whole-archive,保证库里的对象不会被优化掉。
Pulitzer 发表于 2025-8-24 07:35 | 显示全部楼层
你说的三个项目共用代码,这种场景其实可以考虑建成一个共享源码目录,用工程引用而不是静态库。
Uriah 发表于 2025-8-24 07:36 | 显示全部楼层
注意不同编译器或不同优化等级下生成的 ABI 是否一致,不然也可能报未定义引用。
Clyde011 发表于 2025-8-24 07:37 | 显示全部楼层
我建议你先单独做个最小例子,把一两个函数编成库再在主工程调用,逐步排查问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部