修改生成文件以生成程序集文件



我是make的新手,我无法将.asm输出添加到已经存在的makefile中。我想制作makefile以生成所有.c文件的.asm文件(使用AVR-GCC -S(。你能帮我弄清楚吗?

# AVR model
MMCU = atmega16
# Clock frequency
F_CPU = 16000000
# Programmer model
PROGRAMMER = usbasp
PROGRAMMER_PORT = usb
# Output file name
PROJECT = main
# Sources files
SOURCES = main.c
cross/drivers/internals/GPIO/GPIO.c 
cross/drivers/internals/PPI/PPI8Bit.c 
cross/drivers/internals/USART/USART_0.c 
CC = avr-gcc
ASM = avr-gcc
OBJCOPY = avr-objcopy
CDEFS = -DF_CPU=$(F_CPU)UL
CFLAGS = $(CDEFS)
CFLAGS += -mmcu=$(MMCU) -g -Os -Wall
OBJS = $(SOURCES:.c=.o)
ASMS = $(SOURCES:.c=.s)
$(PROJECT).hex: $(PROJECT).out
$(OBJCOPY) -O ihex -R .eeprom $(PROJECT).out $(PROJECT).hex
$(PROJECT).out:  $(OBJS)
$(CC)  $(CFLAGS) $^ -o $@ -lm
$.o:%.c
$(CC) $(CFLAGS) $< -o $@
##???
$.s:%.c
$(CC) $(CFLAGS) -S $< -o $@
asm: $(OBJS_S)
flash: $(PROJECT).hex
avrdude -c $(PROGRAMMER) -P $(PROGRAMMER_PORT) -p $(MMCU) -U flash:w:$(PROJECT).hex
clean:
rm -f $(OBJS)
rm -f $(PROJECT).out
rm -f $(PROJECT).hex
.PHONY: clean program_flash

谢谢

寻求帮助时,请始终包括 make 的版本、您键入的确切(剪切和粘贴(命令以及问题所在(如果适用,使用剪切和粘贴输出(。 说"我做不到"并不能帮助我们理解问题所在。

这些绝对是不对的:

$.o:%.c
...
$.s:%.c

模式规则在:的两侧使用%,如下所示:

%.o:%.c
...
%.s:%.c

其次,将 asm 文件放入此变量中:

ASMS = $(SOURCES:.c=.s)

但随后您将一个完全不同的变量列为asm目标的先决条件:

asm: $(OBJS_S)

据我所知,这个OBJS_S变量从未被定义过。

编译 C/C++ 文件(或任何其他语言(时,GCC 总是生成中间汇编代码。 它保存在某个 tmp 目录中(除非您使用 -pipe(。如果您希望 GCC 将此中间程序集保存在 .s 文件中,可以选择-save-temps(除了中间程序集之外,这也将预处理的源保存在 .i (C( 或 .(C++((。 您可以添加包含 C/C++ 代码的其他注释来指导您;为此使用-fverbose-asm。 如果您使用的是 LTO (-flto( 等,新的编译器版本只会将 lto 乱码写入汇编(在链接时由 lto 编译器拾取(。 为了在这种情况下保存汇编代码,请添加-ffat-lto-objects。 但是请注意,当您与 -flto 链接时,这不是最终的 asm(它调用将 lto 乱码编译为 asm 的 lto 编译器(。 最终的 asm 可以在一些 ltrans 转储中看到 -save-temps。您还可以使用-save-temps=obj-save-temps=src将中间文件保存在目标文件或源文件附近(以防万一(。

最新更新