我是GNU make 的新手。我想将我所有的程序集源文件编译成具有相同名称的单独目标文件。将来,如果我添加更多的程序集源文件,Makefile应该仍然可以不加修改地工作。
例如我在根目录中
$ ls
Makefile obj src
$ ls src
file1.s file2.s
Run Code Online (Sandbox Code Playgroud)
在make我想要之后
$ ls obj
file1.o file2.o
Run Code Online (Sandbox Code Playgroud)
将来如果我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)
Run Code Online (Sandbox Code Playgroud)
make在shell中运行后,我收到错误:
make: *** No rule to make target `src/*.s', needed by `obj/*.o'. Stop.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我犯了什么错误?我已经检查过我在食谱前面使用了标签。先感谢您。
这行不通:
objects = $(objdir)/*.o
Run Code Online (Sandbox Code Playgroud)
当你第一次运行 make 时,它会扩展到什么?您没有目标文件,因此通配符将扩展为没有文件。或者,如果您有一些目标文件并创建一个新的源文件,它将扩展为什么?它只会扩展到现有的目标文件。
由于您只是要求 make 构建已经存在的目标文件,因此它永远不会构建不存在的目标文件。
您需要做的是告诉 make为每个源文件构建一个目标文件。
你可以这样做:
srcdir = src
sources = $(wildcard $(srcdir)/*.s)
objdir = obj
objects = $(sources:$(srcdir)/%.c=$(objdir)/%.o)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |