汇编程序的Makefile将源文件作为目标文件处理

问题描述 投票:0回答:1

我是新来的 GNU make. 我想把所有的汇编源文件编译成名称相同的独立对象文件。将来,如果我增加了更多的装配体源文件,就会出现 Makefile 应该不需要修改也能正常工作。

例如,我在根目录下

$ ls
Makefile obj src
$ ls src
file1.s file2.s

之后 make 我想

$ ls obj
file1.o file2.o

将来如果我增加一个 file3.s 对我 src 目录,在 make 我想要一个新的 file3.o 在我 obj 目录。

我读过关于 静态模式规则 在GNU make手册中,我认为这就是我所需要的。我写了下面的Makefile。

path = /path/to/toolchain/bin
AS = $(path)/llvm-mc
ASFLAGS = -filetype=obj

srcdir = src
sources = $(srcdir)/*.s
objdir = obj
objects = $(objdir)/*.o

.PHONY: all
all: $(objects)

$(objects): $(objdir)/%.o: $(srcdir)/%.s
        $(AS) $(ASFLAGS) $< -o $@

.PHONY: clean
clean:
        rm $(objects)

在运行 make 在shell中,我得到了错误。

make: *** No rule to make target `src/*.s', needed by `obj/*.o'.  Stop.

谁能告诉我我犯了什么错误?我已经检查了,我使用的食谱前面的标签。先谢谢你。

assembly makefile
1个回答
5
投票

这是不可能的。

objects = $(objdir)/*.o

当你第一次运行make的时候 这个文件会扩展成什么? 你没有对象文件,所以通配符会扩展为没有文件。 或者,如果你有一些对象文件,并创建一个新的源文件,它将扩展到什么? 它将只扩展到现有的对象文件。

由于你只要求make建立已经存在的对象文件,所以它绝不会建立不存在的对象文件。

你需要做的是告诉make建立一个对象文件。对于每个源文件.

你可以这样做。

srcdir = src
sources = $(wildcard $(srcdir)/*.s)
objdir = obj
objects = $(sources:$(srcdir)/%.c=$(objdir)/%.o)
© www.soinside.com 2019 - 2024. All rights reserved.