问题描述
我目前正在研究一个相当通用的通信堆栈。它在一端获取字节,解析数据包并调用回调。
我想在静态库(即 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 是否可行以及如何实现?
如果不可行,要记住哪些变量来确定不同的构建风格?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)