IAR 的生成文件。源列表
Makefile for IAR. List of src
我的 Makefile 中有变量:
SRCP = \
main.c \
lib1/src/file1.c \
lib2/src/file2.c
文件夹 lib1/src
和 lib2/src
可能包含其他来源,但我只需要编译 SRCP
var.
中的文件
我知道一种变体:
OBJ_DIR = ./Release/Obj
OBJ = $(SRC:.c=.o)
$(OBJ): $(SRCP)
for source in $(SRCP); do \
$(CC) $(CLAGS) -c $$source -o $(OBJ_DIR)/$@; \
done
但没有提供信息。在控制台中,我看到 $source
而不是 main.c
(或任何名称)。
我的 makefile 有错误:
.PHONY: all clean
PROJECT = hello
IAR_TARGET = ./Release
EXE_DIR = $(IAR_TARGET)/Exe
OBJ_DIR = $(IAR_TARGET)/Obj
COMPILE_OPTS = -mcpu=cortex-m3 -mthumb -Wall -g -O0
INCLUDE_DIRS = -I . \
-I lib/inc
SRCP = \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
LIB = -L ./lib/src
SRC := $(notdir $(SRCP))
OBJ_FILES := $(addprefix $(OBJ_DIR)/,$(notdir $(SRCP:.c=.o)))
CC = arm-none-eabi-gcc
CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS)
# mkdir -p $(EXE_DIR) $(OBJ_DIR)
all: $(EXE_DIR)/$(PROJECT).elf
# Linker invocation
$(EXE_DIR)/$(PROJECT).elf: $(OBJ_FILES)
$(CC) $(CFLAGS) $(OBJ_FILES) -o $(EXE_DIR)/$(PROJECT).elf
# Rules
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(IAR_TARGET)
错误:make: *** No rule to make target 'Release/Obj/main.o', needed by 'Release/Exe/hello.elf'. Stop.
您知道的正确版本是什么?
我对 IAR 项目没有任何具体经验。但我想我可以在 Makefile 方面为您提供帮助。
我建议的主要变化是:
更改 OBJ_FILES
的定义,使其包含具有正确路径名的目标文件列表,例如./Release/Obj/file1.o
。 notdir
删除目录,addprefix
添加新目录。
添加如何将 .c
文件转换为 .o
文件的模式规则。由于目标文件是最终文件(本例中为 .elf
文件)的依赖项,并且没有明确的规则来构建这些目标文件,因此 make
将使用模式规则来构建它们。
很可能,此生成文件需要 GNU make。
SRCP = \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
OBJ_DIR = ./Release/Obj
OBJ_FILES := $(addprefix $(OBJ_DIR)/,$(notdir $(SRCP:.c=.o)))
# Linker invocation
$(OUTPUT_DIR)/$(PROJECT).elf: $(OBJ_FILES)
$(CC) $(LDFLAGS) $(OBJ_FILES) $(STD_LIBS) -o $(OUTPUT_DIR)/$(PROJECT).elf
# Rules
$(OBJDIR)/%.o: ./%.c
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o: lib/src/%.c
$(CC) $(CFLAGS) -c $< -o $@
我知道!
我有路径为的文件列表:
SRCP := \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
如何通过对象名获取带路径的.c文件?
看:
OBJ_DIR=Release/Obj
# Rules
%.o:
@echo creating $@ ...
$(CC) $(CFLAGS) -c $(filter %$(subst .o,.c,$@), $(SRCP)) -o $(OBJ_DIR)/$@
这个$(filter %$(subst .o,.c,$@), $(SRCP))
如何工作?
- 例如,$@有
stm32f10x_adc.o
$(subst .o,.c,$@)
将 .o 更改为 .c,所以我们有 stm32f10x_adc.c
。 非常重要!这个字符串没有空格(我喜欢:))。我写错了$(subst .o, .c, $@)
。我不清楚 (:
%$(subst .o,.c,$@)
。 % 使用过滤器。
$(filter %$(subst .o,.c,$@), $(SRCP))
从带路径的 $(SRCP) 中获取 %stm32f10x_adc.c
。还有...我们有 lib/src/stm32f10x_adc.c
!
谢谢您的帮助!
我的 Makefile 中有变量:
SRCP = \
main.c \
lib1/src/file1.c \
lib2/src/file2.c
文件夹 lib1/src
和 lib2/src
可能包含其他来源,但我只需要编译 SRCP
var.
我知道一种变体:
OBJ_DIR = ./Release/Obj
OBJ = $(SRC:.c=.o)
$(OBJ): $(SRCP)
for source in $(SRCP); do \
$(CC) $(CLAGS) -c $$source -o $(OBJ_DIR)/$@; \
done
但没有提供信息。在控制台中,我看到 $source
而不是 main.c
(或任何名称)。
我的 makefile 有错误:
.PHONY: all clean
PROJECT = hello
IAR_TARGET = ./Release
EXE_DIR = $(IAR_TARGET)/Exe
OBJ_DIR = $(IAR_TARGET)/Obj
COMPILE_OPTS = -mcpu=cortex-m3 -mthumb -Wall -g -O0
INCLUDE_DIRS = -I . \
-I lib/inc
SRCP = \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
LIB = -L ./lib/src
SRC := $(notdir $(SRCP))
OBJ_FILES := $(addprefix $(OBJ_DIR)/,$(notdir $(SRCP:.c=.o)))
CC = arm-none-eabi-gcc
CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS)
# mkdir -p $(EXE_DIR) $(OBJ_DIR)
all: $(EXE_DIR)/$(PROJECT).elf
# Linker invocation
$(EXE_DIR)/$(PROJECT).elf: $(OBJ_FILES)
$(CC) $(CFLAGS) $(OBJ_FILES) -o $(EXE_DIR)/$(PROJECT).elf
# Rules
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(IAR_TARGET)
错误:make: *** No rule to make target 'Release/Obj/main.o', needed by 'Release/Exe/hello.elf'. Stop.
您知道的正确版本是什么?
我对 IAR 项目没有任何具体经验。但我想我可以在 Makefile 方面为您提供帮助。
我建议的主要变化是:
更改
OBJ_FILES
的定义,使其包含具有正确路径名的目标文件列表,例如./Release/Obj/file1.o
。notdir
删除目录,addprefix
添加新目录。添加如何将
.c
文件转换为.o
文件的模式规则。由于目标文件是最终文件(本例中为.elf
文件)的依赖项,并且没有明确的规则来构建这些目标文件,因此make
将使用模式规则来构建它们。
很可能,此生成文件需要 GNU make。
SRCP = \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
OBJ_DIR = ./Release/Obj
OBJ_FILES := $(addprefix $(OBJ_DIR)/,$(notdir $(SRCP:.c=.o)))
# Linker invocation
$(OUTPUT_DIR)/$(PROJECT).elf: $(OBJ_FILES)
$(CC) $(LDFLAGS) $(OBJ_FILES) $(STD_LIBS) -o $(OUTPUT_DIR)/$(PROJECT).elf
# Rules
$(OBJDIR)/%.o: ./%.c
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o: lib/src/%.c
$(CC) $(CFLAGS) -c $< -o $@
我知道!
我有路径为的文件列表:
SRCP := \
main.c \
lib/src/stm32f10x_tim.c \
lib/src/stm32f10x_adc.c
如何通过对象名获取带路径的.c文件? 看:
OBJ_DIR=Release/Obj
# Rules
%.o:
@echo creating $@ ...
$(CC) $(CFLAGS) -c $(filter %$(subst .o,.c,$@), $(SRCP)) -o $(OBJ_DIR)/$@
这个$(filter %$(subst .o,.c,$@), $(SRCP))
如何工作?
- 例如,$@有
stm32f10x_adc.o
$(subst .o,.c,$@)
将 .o 更改为 .c,所以我们有stm32f10x_adc.c
。 非常重要!这个字符串没有空格(我喜欢:))。我写错了$(subst .o, .c, $@)
。我不清楚 (:%$(subst .o,.c,$@)
。 % 使用过滤器。$(filter %$(subst .o,.c,$@), $(SRCP))
从带路径的 $(SRCP) 中获取%stm32f10x_adc.c
。还有...我们有lib/src/stm32f10x_adc.c
!
谢谢您的帮助!