我的makefile看起来像这样:
SRCS = $(wildcard *.asm)
OBJS = ${SRCS:.asm=.o}
# define a suffix rule for .asm -> .o
.asm.o : $(SRCS)
nasm -f elf $<
all: $(OBJS)
gcc -o ?? $<
^need the name of the target without file extension here ($* is blank)
Run Code Online (Sandbox Code Playgroud)
但是,$*在内部工作.asm.o但内部空白all.如何在没有任何扩展名的情况下将gcc输出文件名设置为目标文件的文件名?
例如,我希望它执行以下操作(在.m文件由nasm生成之后)
gcc filename filename.o
Run Code Online (Sandbox Code Playgroud)
小智 10
Use VAR = $(basename your_file.ext) <=> $(VAR) = your_file
Run Code Online (Sandbox Code Playgroud)
假设您要从.o中删除test.o
VAR = $(basename test.o)
Run Code Online (Sandbox Code Playgroud)
导致$VAR包含“测试”
我想你在找
.PHONY: all
all: $(patsubst %.o,%,$(OBJS))
%: %.o
gcc -o $@ $<
Run Code Online (Sandbox Code Playgroud)
您的尝试将定义一个all依赖于所有目标文件的目标,就好像它包含所有目标文件一样; 我认为你真的希望每个目标文件都是独立的,并且all目标依赖于它们所有的目标.
(从技术上讲,你现在可以使用,$*因为它与$@这种情况相同,但这只是模糊不清.)
这与您现有的nasm规则基本上是同构的,除非没有后缀,否则不能使用后缀语法.换句话说,你的规则相当于
OBJS = $(patsubst %.asm,%.o,$(SRCS))
%.o: %.asm
nasm -f elf $<
Run Code Online (Sandbox Code Playgroud)
唯一剩下的区别是.PHONY只是文件all不是文件名的声明.
| 归档时间: |
|
| 查看次数: |
17172 次 |
| 最近记录: |