Получить имя файла без расширения в makefile

мой make-файл выглядит так:

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 в имя файла объект file без любой

2 ответов


Я думаю, что вы ищете

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

ваша попытка определит цель all который зависел от всех объектных файлов, как если бы он содержал их все; я предполагаю, что вы действительно хотите, чтобы каждый объектный файл был независимым, и для all цель, чтобы зависеть от них всех.

(технически теперь вы можете использовать $* потому что он идентичен $@ в этом случае, но это просто непонятных.)

это по большому счету изоморфно вашему существующий nasm правило, за исключением случаев, когда нет суффикса, вы не можете использовать синтаксис суффикса. Другими словами, ваше правило эквивалентно

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

единственная оставшаяся разница-это .PHONY декларация, которая просто документирует это all не является именем файла.


Use VAR = $(basename your_file.ext) <=> $(VAR) = your_file

предположим, что вы хотите удалить .o С test.o

VAR = $(basename test.o)

в результате $VAR содержащий "тест"

См. Больше Функций Здесь