通过makefile中的-defsym设置符号值

问题描述 投票:0回答:1

我想通过 makefile 动态设置链接描述文件中定义的符号。

在目标规则中我有以下代码:

$(OBJCOPY) -O binary --only-section=.text $(APPNAME).elf $(APPNAME).bin
$(SREC_CAT) $(APPNAME).bin $(SRECFLAGS) -Output $(SRECOUT).txt --hex-dump
CRC_FROM_FILE= cat $(SRECOUT).txt | cut -c 10-21 | sed 's/\ //g'
$(LD) -Bstatic -nostdlib --gc-sections -defsym=CRC=0x11223344 \

这段代码运行良好。

但现在我想通过以下方式动态设置它:

$(OBJCOPY) -O binary --only-section=.text $(APPNAME).elf $(APPNAME).bin
$(SREC_CAT) $(APPNAME).bin $(SRECFLAGS) -Output $(SRECOUT).txt --hex-dump
CRC_FROM_FILE= cat $(SRECOUT).txt | cut -c 10-21 | sed 's/\ //g'
$(LD) -Bstatic -nostdlib --gc-sections -defsym=CRC=$(CRC_FROM_FILE) \

编译结果:

c:\gcc-arm-8.2-2018.08-i686-mingw32-arm-eabi\bin\arm-eabi-ld.exe:--defsym:0: syntax error

所以我的问题是为什么?

makefile embedded
1个回答
1
投票

在 Makefile 中使用

$(CRC_FROM_FILE)
动态设置符号时遇到的问题是由于 Makefile 上下文中如何处理变量扩展造成的。

当您编写

-defsym=CRC=$(CRC_FROM_FILE)
时,Makefile 将
$(CRC_FROM_FILE)
解释为 Makefile 变量,该变量可能已定义,也可能未定义,从而导致您看到错误消息。

为了解决这个问题,您可以使用 Makefile 中的

shell
函数来执行命令并捕获其输出。以下是修改代码的方法:

CRC_FROM_FILE := $(shell cat $(SRECOUT).txt | cut -c 10-21 | sed 's/\ //g')

$(OBJCOPY) -O binary --only-section=.text $(APPNAME).elf $(APPNAME).bin
$(SREC_CAT) $(APPNAME).bin $(SRECFLAGS) -Output $(SRECOUT).txt --hex-dump
$(LD) -Bstatic -nostdlib --gc-sections -defsym=CRC=$(CRC_FROM_FILE) \
    # rest of your compilation and linking commands

在此代码中,

$(shell ...)
函数执行命令并捕获其输出,并将其分配给
CRC_FROM_FILE
变量。然后,您可以直接在链接器命令中使用
$(CRC_FROM_FILE)
,不会出现任何问题。

确保将此代码放置在您希望动态符号定义生效的 Makefile 中。这应该可以解决您遇到的语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.