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(或者甚至使用浮点),所以我不确定如何实现这一点。 我想有两种方法:

  • 使用所有微控制器都能理解的指令集编译单个版本的lib。我希望ARMv7也会如此(尽管我还不能100%相信M23/M33也支持这一点)
  • 根据不同的体系结构、FPU等,为不同的风格编译大量不同的LIB
  • 正如您所想象的,我更希望保持简单并选择选项1,但我不确定如何“说服”链接器将这两个链接起来(或者如何说服编译器不关心lib的浮点)

    有人知道备选方案1是否可行以及如何实现吗

    如果不可行,那么在确定不同的构建风格时需要记住哪些变量

    有人知道选项1是否可行吗

    嗯,可能是可行的

    如何实现这一目标

    获取所有要支持的处理器,并确定所有这些处理器上可用的指令集。然后编译该指令集

    但是,请不要,这是一个解决办法

    如果不可行,那么在确定不同的构建风格时需要记住哪些变量

    Gcc有一些类似于“多库配置文件”。请参见
    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