1

私のmakefileはリンクコマンドを定義しています:

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) $(PROD_OBJS)

ここ$(PROD_OBJS)で、は次の形式のオブジェクトファイルのリストです。

PROD_OBJS = objfile1.obj objfile2.obj objfile3.obj ... objfileN.obj

これで、makefile自体がプロジェクトディレクトリのルートにあります。ルートにオブジェクトファイルとリストファイルがあると面倒になります。サブフォルダーに入れたいと思います。

objファイルのビルドとサブフォルダーへの出力は機能します。サフィックスと推論を使用して実行しています。

.s.obj:
    $(ASSEMBLY) $(FLAGS) $*.s -o Objects\$*.obj

問題は、Objectsフォルダをlinkコマンドに渡すことです。

私は試した:

prod_link = $(LINK) $(LINK_FLAGS) -o$(PROD_OUT) Objects\$(PROD_OBJS)

ただし、オブジェクトファイルのリストの最初のファイルのみがフォルダの名前を取得します。

Objectsリストのすべてのファイルにサブフォルダーを渡すにはどうすればよい$(PROD_OBJS)ですか?


編集

私もやってみました

PROD_OBJS = $(patsubst %.ss,Object\%.obj, $(PROD_SRC))

しかし得た:

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

これはかなり奇妙です...

4

2 に答える 2

1

nmakeはGNUMakeではなく、かなりゴミです詳細については、NMAKEリファレンスを参照してください。

問題が発生する限り(に変換1.o 2.o 3.od/1.o d/2/o d/3.o、試してみてください

OBJS= 1.o 2.o 3.o
# Looks wierd I know, but basically change ' ' to ' d/'
# (and it's not very robust!)
OBJS_WITH_PREFIX= d/$(OBJS: = d/)
!ERROR [$(OBJS_WITH_PREFIX)]

ちなみに、あなたのパターンルールはnmakeに嘘をついています。.s.obj:「.sファイルを.objに変換する方法は次のとおりです」と言いますが、指定したコマンドは実際にはサブフォルダーにオブジェクトを作成します。パターンルールは。で開始する必要があります.s{Objects\}.obj:。詳細については、ドキュメントを参照してください(ルールの検索パス)。

于 2010-12-24T11:23:26.383 に答える
0

パーティーに非常に遅れましたが、他の誰かが同じ問題に遭遇した場合:

このエラー

makefile(51) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.

patsubst構文がnmakeでサポートされていないように見えるという事実が原因です。代替構文を使用してこれを回避できます

$(var:suffix=replacement)

それ以外の

$(patsubst %suffix,%replacement,$(var))

(これはgnumakeでも有効です)。

于 2015-09-01T21:51:35.377 に答える