梧桐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

我建议你先单独做个最小例子,把一两个函数编成库再在主工程调用,逐步排查问题。
页: [1]
查看完整版本: 对自定义静态库的未定义引用