在makefile中获取没有扩展名的文件名

Ani*_*han 11 makefile

我的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包含“测试”

在这里查看更多功能


tri*_*eee 6

我想你在找

.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不是文件名的声明.

  • 要从列表中删除后缀,您还可以使用`basename` builtin:`all:$(basename $(OBJS))`. (15认同)
  • ldelic的评论暗示DarkCthulhu也可以在他的规则中写出`gcc -o $(basename $ &lt;)$ &lt;`。 (2认同)