0

makefile があります (nmake と VC++ 2005 を使用):

CPP_OBJS = $(CPP_SOURCE:.cpp=.obj)


$(TARGET) : $(CPP_OBJS)
    $(link) $(ldebug) $(lflags) /DLL \
    $(LIBPATHS) \
    $out:$@ $(CPP_OBJS) $(conlibs)  

問題は、 $(CPP_OBJS) がファイルのリストに展開され、各ファイル名の前にフォルダー名が追加されるため、リンクステップが失敗することです (CPP_SOURCE から生成された方法)。また、すべての .obj ファイルが現在のフォルダー (コンパイルの結果) にあるため、link.exe は .obj を見つけることができません。

次のようなものが必要です: (ここで見つけました: http://uw714doc.sco.com/cgi-bin/info2html?%28make.info%29File%2520Name%2520Functions&lang=en )

`$(notdir NAMES...)' NAMES の各ファイル名のディレクトリ部分を除くすべてを抽出します。ファイル名にスラッシュが含まれていない場合は、変更されません。それ以外の場合、最後のスラッシュまでのすべてが削除されます。

しかし、それは VC++ 2005 に付属する NMAKE では機能していないようです。

この問題を克服する方法についてのアイデアは大歓迎です。ありがとうございました。

4

3 に答える 3

2

$(notdir)NMAKEを使用している間は、GNU make機能であるため、は機能しません。

あなたが何をしようとしているのかは私には完全にはわかりませんが、あなたの質問に対する簡単な答えは、ファイル修飾子を使用してNMAKE自動変数を使用することです。この場合$(**)、ターゲットに対するすべての前提条件のリストであり、F修飾子を追加すると、ディレクトリ名が削除されます。例えば:

CPP_SOURCE=subdir/foo.cpp subdir/bar.cpp
CPP_OBJS=$(CPP_SOURCE:.cpp=.obj)
all: $(CPP_OBJS)
        @echo Unmodified: $(**)
        @echo Filenames only: $(**F)

subdirファイルfoo.objとのディレクトリがあるとするとbar.obj、次のように出力されます。

Unmodified: subdir/foo.obj subdir/bar.obj
Filenames only: foo.obj bar.obj

お役に立てば幸いです。

于 2010-12-07T17:24:56.917 に答える
0

nmakeは '$( notdir NAMES...)' をサポートしておらず、そのマクロ置換はソース ファイル名からフォルダー階層を簡単に削除することをサポートしていないため、コンパイルを変更して、オブジェクト ファイルをソースと同じフォルダに移動しますか?

cpp.obj:
    $(CC) $(CFLAGS) /c /Fo $*.obj $*.cpp

私は nmake の専門家ではありませんが、この問題を解決するのに役立つと思います。

于 2009-12-16T07:00:19.533 に答える
-1

NMAKE についてはよくわかりませんが (GNU Make を使用しています)、基本的に 2 つのオプションがあると思います。

  1. 必要な結果が得られるまで、テキスト関数を試してください。$(notdir...) が何をするかはわかりませんが、たとえば $(patsubst...) 、または $(subst...) 、 $( word...) および $(words...).
  2. 最初からパスを除外します。CPP_SOURCE にパスが含まれていない場合、CPP_OBJS も含まれません。VPATHを使用して、ソースの場所を make に伝えます。
于 2009-12-09T15:50:21.977 に答える