我有一个使用arm-none-eabi工具链在Linux和Windows下使用的makefile。该项目包含扩展名.s或.S的汇编程序文件,具体取决于预处理器的需求。
在Linux下,makefile规则可以轻松区分那些目标文件,并且每个目标文件都使用单独的规则。在这个世界上没有问题。 在Windows下,我定义的用于处理.S文件的规则无法处理这些文件。另一方面,我对.s文件的规则很好用。
返回的错误是:
make: Pas de règle pour fabriquer la cible « obj/secmodes.S », nécessaire pour « imgm_essProcMode.elf ». Arrêt.
No rule to build the target obj/secmode.S, required for imgm_essProcMode.elf. Stop
我不明白为什么源代码的路径不正确:所有.s,.s,.c都位于“ src”文件夹中; “ obj”文件夹用于生成的对象... 我意识到Windows不在乎扩展名!这似乎使(gnu)混淆。
所以我的问题是,我们可以在Windows环境中执行的makefile中以不同方式管理.s和.S吗?如果是这样,应该如何修改我的规则?
以下是我的makefile的快照:
AOBJ_FILES := $(addprefix obj/,$(notdir $(ASM_FILES:.s=.o)))
ASOBJ_FILES := $(addprefix obj/,$(notdir $(ASMS_FILES:.S=.o)))
ALL_OBJ_FILES := $(COBJ_FILES) $(AOBJ_FILES) $(ASOBJ_FILES)
.../...
image : $(BINEXECUTABLE)
all : $(EXECUTABLE)
obj/%.o: src/%.S
$(TCPREFIX)-gcc $(AOPTgcc) -Xassembler -acdghln=$(basename $@).lst -o $@ $<
obj/%.o: src/%.s
$(TCPREFIX)-as $(AOPT) $< -o $@ -acdghln=$(basename $@).lst
obj/%.o: src/%.c
$(TCPREFIX)-gcc $(COPT) -Wa,-acdghln=$(basename $@).lst $(DEFINES) -o $@ $<
$(EXECUTABLE): $(ALL_OBJ_FILES)
$(TCPREFIX)-gcc $(LOPTgcc) $^ -o $@
谢谢您的提示!
答案 0 :(得分:2)
这与make无关。如您所说,是操作系统无法区分大小写。如果文件系统不支持仅大小写不同的文件名,则没有像make这样的程序可以解决这个问题。
您不仅要用不同的名称来命名文件,还必须使用.s
和.sc
或其他名称,而不是.s
和{{1} }。
答案 1 :(得分:0)
感谢MadScientist,解决方案的确使用了另一种扩展,而不是大写。
我首先尝试了一个随机的(.sp),但被gcc拒绝了。就我而言,对于需要预处理的asm文件,适当的扩展名是.sx。只需对这些文件的makefile进行少量修改就可以解决所有问题!
再次感谢MadScientist。