19

我的生成文件如下所示:

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 输出文件名设置为没有任何扩展名的目标文件的文件名?

例如,我希望它执行以下(在.o文件由nasm生成之后)

gcc filename filename.o
4

2 回答 2

15

我想你正在寻找

.PHONY: all
all: $(patsubst %.o,%,$(OBJS))
%: %.o
    gcc -o $@ $<

您的尝试将定义一个all依赖于所有目标文件的目标,就好像它包含所有目标文件一样;我想你真的希望每个目标文件都是独立的,并且all目标依赖于它们都被制作出来。

(从技术上讲,您现在可以使用$*它,因为它与$@在这种情况下相同,但这只是晦涩难懂。)

这基本上与您现有的nasm规则同构,除非没有后缀,否则您不能使用后缀语法。换句话说,您的规则相当于

OBJS = $(patsubst %.asm,%.o,$(SRCS))
%.o: %.asm
    nasm -f elf $<

唯一剩下的区别是.PHONY仅记录all不是文件名的声明。

于 2012-12-21T19:26:42.360 回答
6
Use VAR = $(basename your_file.ext) <=> $(VAR) = your_file

Let's say that you want to remove .o from test.o

VAR = $(basename test.o)

resulting in $VAR containing "test"

See More Functions Here

于 2017-10-06T01:09:59.300 回答