我想通过 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 中使用
$(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 中。这应该可以解决您遇到的语法错误。