19

私の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出力ファイル名を拡張子なしのオブジェクトファイルのファイル名に設定するにはどうすればよいですか?

たとえば、次のように実行したい(.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

.oから削除したいとしましょうtest.o

VAR = $(basename test.o)

結果として$VAR「テスト」が含まれる

ここで他の関数を参照してください

于 2017-10-06T01:09:59.300 に答える