Gcc 为Cortex M3、M4、M23和M33编译单个静态库
我目前正在开发一个相当通用的通信堆栈。它在一端获取字节,解析数据包并调用回调。 我希望将此堆栈放在静态库中(即Gcc 为Cortex M3、M4、M23和M33编译单个静态库,gcc,linker,cortex-m,cortex-m3,Gcc,Linker,Cortex M,Cortex M3,我目前正在开发一个相当通用的通信堆栈。它在一端获取字节,解析数据包并调用回调。 我希望将此堆栈放在静态库中(即libcommstack.a) 该库面向嵌入式ARM Cortex-M设备。目前,我们已经指定至少应使用Cortex-M3(但也应适用于M4或M33) 现在我正在将它集成到另一个应用程序中,以验证链接它是可能的。未来的想法是,我们将把这个.a文件发送给客户,这样他们就可以围绕它构建自己的应用程序,而无需直接访问我们的源代码(封装我们的IP) 我们使用GCC ARM v7.2.1编译库和链
libcommstack.a
)
该库面向嵌入式ARM Cortex-M设备。目前,我们已经指定至少应使用Cortex-M3(但也应适用于M4或M33)
现在我正在将它集成到另一个应用程序中,以验证链接它是可能的。未来的想法是,我们将把这个.a
文件发送给客户,这样他们就可以围绕它构建自己的应用程序,而无需直接访问我们的源代码(封装我们的IP)
我们使用GCC ARM v7.2.1编译库和链接到库的应用程序。
我试图与之集成的应用程序是为Cortex M33编译的,带有-mfloat abi=hard-mfpu-fpv6-sp-d16
库的代码不使用任何浮点,而是使用-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(或者甚至使用浮点),所以我不确定如何实现这一点。
我想有两种方法:
arm none eabi gcc——打印多库输出。如果安装了newlib,可以转到/usr/arm none eabi/lib/thumb/
,查看其中的目录-为每个配置文件编译newlib,并为其安装单独的库,根据配置选择不同的库。为每个配置文件编译,并通过将库放在适当的/usr/arm-none-eabi/lib/property/directory/here
中对库进行打包,编译器将自己拾取它们(有关库搜索路径,请参见gcc-v
输出)。例如,搜索发生在何处的newlib源代码时,无法找到它。(). 以cmake作为后端为例,您可以按如下方式编译和安装:
arm-none-eabi-gcc --print-multi-lib |
while IFS=';' read -r dir opts; do
cmake -B builddir CMAKE_C_FLAGS="$opts" CMAKE_INSTALL_LIBDIR="$dir"
cmake --build builddir
cmake --install builddir --prefix "/usr/arm-none-eabi/"
done