首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为IAR准备的。src清单

为IAR准备的。src清单
EN

Stack Overflow用户
提问于 2018-01-06 18:43:52
回答 2查看 1.5K关注 0票数 1

我的Makefile中有变量:

代码语言:javascript
复制
SRCP = \
 main.c \
 lib1/src/file1.c \
 lib2/src/file2.c

文件夹lib1/srclib2/src可能包含其他来源,但是我只需要SRCP var中的compil文件。

我知道一个变体:

代码语言:javascript
复制
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 (或任何名称)。

我的错误生成文件:

代码语言:javascript
复制
.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.

你所知道的正确版本是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 15:24:35

我知道呀!

我有带有路径的文件列表:

代码语言:javascript
复制
SRCP := \
  main.c \
  lib/src/stm32f10x_tim.c \
  lib/src/stm32f10x_adc.c

如何通过对象名获得带有路径的.c文件?看:

代码语言:javascript
复制
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

谢谢你的帮助!

票数 0
EN

Stack Overflow用户

发布于 2018-01-06 19:36:39

我对IAR项目没有任何具体的经验。但我想我可以帮你搞定那个。

我建议的主要修订如下:

  • 更改OBJ_FILES的定义,使其包含具有正确路径名称的对象文件列表,例如./Release/Obj/file1.onotdir删除目录,addprefix添加新目录。
  • 添加如何将.c文件转换为.o文件的模式规则。由于对象文件是最终文件(本例中的.elf文件)的依赖项,并且由于没有明确的规则来构建这些对象文件,所以make将使用模式规则来构建它们。

很可能,这个makefile需要GNU make。

代码语言:javascript
复制
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 $@
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48130647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档