0

次のメイクファイルがあるとします。

SRC = trav.cpp
LSRC = node.cpp tree.cpp
LIB = lib/libvtree.so

OBJS = $(patsubst %.cpp,obj/%.o,$(SRC))
LOBJS = $(patsubst %.cpp,obj/%.o,$(LSRC))


$(LOBJS) : $(LSRC)
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : $(SRC)
      $(CC) -o $@ -c $<

$(LIB) : $(LOBJS)
      $(CC) -shared -o $@ $(LOBJS) $^

trav.exe: $(LOBJS) $(OBJS) $(LIB)
      $(CC) -o $@ $(LFLAGS) $(OBJS) -Llib libvtree -lstdc++

基本的に、2 セットの cpp ファイルをコンパイルしようとしています: $(LSRC) をライブラリに、$(SRC) をそのライブラリにリンクする実行可能ファイルにコンパイルします。

しかし、それを「作成」しようとすると、次のエラーが発生します。

gcc -fPIC -o obj/node.o -g -DMEMPOOL -c src/node.cpp
gcc -fPIC -o obj/tree.o -g -DMEMPOOL -c src/node.cpp

node.cpp を両方の .o ファイルにコンパイルしようとし続けます。

ディレクトリツリーを分割して再帰的なmakeを使用せずに、ファイルの個別のセットに個別のルールを指定するmakeの方法はありますか?

ありがとう。

4

1 に答える 1

2

これらのルールは、おそらくあなたが思っていることを行っていません:

$(LOBJS) : $(LSRC)
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : $(SRC)
      $(CC) -o $@ -c $<

$<ルールの最初の前提条件に展開されます。これは、ソース ファイルが$(SRC)リストの最初にあることを意味します。あなたはそれを望んでおらず、実際にはおそらく依存関係の誤った表現です-に依存node.oしていませんtree.cppよね?

これを機能させるには、特定のオブジェクトを特定のソース ファイルと一致させるパターン ルールにする必要があります。

$(LOBJS) : obj/%.o : %.cpp
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : obj/%.o : %.cpp
      $(CC) -o $@ -c $<

そこにもが必要な場合がありsrc/ますが、元のファイルのどこから来たのかわかりません。-g -DMEMPOOLあまりにも、それについては。

編集者注記: C++ プログラムを持っているためCXXというよりは、慣用的に使用することになります。CC

于 2013-05-07T15:13:08.667 に答える