[英]Modifying Makefile to produce assembly files
我是 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) 和 .ii (C++) 中)。 您可以添加包含 C/C++ 代码的附加注释来指导您; -fverbose-asm
使用-fverbose-asm
。 在您使用 LTO ( -flto
) 等的情况下,新的编译器版本只会将 lto 乱码写入程序集(由 lto 编译器在链接时拾取)。 为了在这种情况下保存汇编代码,请添加-ffat-lto-objects
。 但是请注意,当您使用 -flto(它调用将 lto 乱码编译为 asm 的 lto 编译器)链接时,这不是最终的 asm。 可以在某些 ltrans 转储中使用 -save-temps 看到最终的 asm。 您还可以使用-save-temps=obj
和-save-temps=src
将中间文件保存在您的目标文件附近。 您的源文件(以防万一)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.