【发布时间】:2021-04-08 16:49:30
【问题描述】:
我目前正在研究一个相当通用的通信堆栈。它在一端获取字节,解析数据包并调用回调。
我想把这个堆栈放在一个静态库中(即libcommstack.a)。
该库面向嵌入式 ARM Cortex-M 设备。目前我们已经指定至少应该使用 Cortex-M3(但它也应该适用于 M4 或 M33)。
现在我正在将它集成到另一个应用程序中以验证是否可以链接它。未来的想法是,我们会将这个.a 文件发送给客户,以便他们可以围绕它构建他们的应用程序,而无需直接访问我们的源代码(以封装我们的 IP)。
我们使用 GCC ARM v7.2.1 来编译库和链接到它的应用程序。
我试图与之集成的应用程序是为带有-mfloat-abi=hard -mfpu-fpv6-sp-d16 的 Cortex M33 编译的。
该库的代码不使用任何浮点,并使用-march=archv7-m 编译(两者都有-mthumb 标志)。
链接似乎一切顺利,直到我真正从库中调用了一个函数。此时链接器开始抱怨:
application.elf uses VFP register arguments, libcommstack.a(somefile.c.obj) does not
failed to merge target specific data of file libcommstack.a(somefile.c.obj)
由于我没有在库中使用浮点数,而且我不知道(预先)目标应用程序是否有 FPU(甚至使用浮点数),我不知道如何处理这个. 我想有两种方法:
- 使用所有微控制器都能理解的指令集编译单个版本的库。我希望 ARMv7 也是如此(尽管我还没有 100% 确信 M23/M33 也支持这一点)。
- 根据不同的架构、FPU 等为不同的风格编译大量不同的库。
正如您可以想象的那样,我更愿意保持简单并选择选项 1,但我不确定如何“说服”链接器链接这两者(或者也许如何说服编译器不关心lib 的浮点数)。
有谁知道选项 1 是否可行以及如何实现?
如果不可行,要记住哪些变量来确定不同的构建风格?
【问题讨论】:
标签: gcc linker cortex-m cortex-m3