Windows上带有文件扩展名的问题

时间:2018-06-27 15:44:18

标签: linux cmd makefile

我有一个使用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 $@

谢谢您的提示!

2 个答案:

答案 0 :(得分:2)

这与make无关。如您所说,是操作系统无法区分大小写。如果文件系统不支持仅大小写不同的文件名,则没有像make这样的程序可以解决这个问题。

您不仅要用不同的名称来命名文件,还必须使用.s.sc或其他名称,而不是.s和{{1} }。

答案 1 :(得分:0)

感谢MadScientist,解决方案的确使用了另一种扩展,而不是大写。
我首先尝试了一个随机的(.sp),但被gcc拒绝了。就我而言,对于需要预处理的asm文件,适当的扩展名是.sx。只需对这些文件的makefile进行少量修改就可以解决所有问题! 再次感谢MadScientist。