我的 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)
但是,$*
在.asm.o
内有效,但在all
内空白。
如何在没有任何扩展名的情况下将gcc输出文件名设置为目标文件的文件名?
例如,我希望它执行以下操作(在nasm生成 .o 文件之后)
gcc filename filename.o
答案 0 :(得分:6)
我认为你在寻找
.PHONY: all
all: $(patsubst %.o,%,$(OBJS))
%: %.o
gcc -o $@ $<
您的尝试将定义一个目标all
,它依赖于所有目标文件,就好像它包含所有目标文件一样;我认为你真的希望每个目标文件都是独立的,并且all
目标依赖于它们。
(从技术上讲,您现在可以使用$*
,因为在这种情况下它与$@
相同,但这只是模糊不清。)
这与您现有的nasm
规则基本上是同构的,除非没有后缀,否则不能使用后缀语法。换句话说,您的规则等同于
OBJS = $(patsubst %.asm,%.o,$(SRCS))
%.o: %.asm
nasm -f elf $<
唯一剩下的区别是.PHONY
声明,它只记录all
不是文件名。
答案 1 :(得分:-1)
Use VAR = $(basename your_file.ext) <=> $(VAR) = your_file
假设您要从.o
test.o
VAR = $(basename test.o)
导致$VAR
包含“test”