0

私は SO の他の場所にあるメイクファイルの簡単な処方箋に従っていると思っていましたが、このメイクファイルを使用して作成すると、次のように不平を言います。

make: *「CI_Metadata.o」が必要とするターゲット「CI_Metadata.cpp」を作成するルールはありません。止まる。

OTHER_INCLUDES+=-I${PWD}/include -I/usr/local/include

all: CI_Metadata.o ConnectMxctl.o Block.o test_block.o
        g++ -o tester CI_Metadata.o ConnectMxctl.o Block.o test_block.o

ConnectMxctl.o: ConnectMxctl.cpp ConnectMxctl.h
        g++ -c $(OTHER_INCLUDES) ConnectMxctl.cpp

CI_Metadata.o: CI_Metadata.cpp CI_Metadata.h
        g++ -c $(OTHER_INCLUDES) CI_Metadata.cpp

Block.o: Block.cpp Block.h
        g++ -c $(OTHER_INCLUDES) Block.cpp

test_block.o: test_block.cpp
        g++ -c $(OTHER_INCLUDES) test_block.cpp
4

1 に答える 1

1

vpathGNU make を使用すると、このような状況でディレクティブを使用できます。を使用しない Makefile と比較して、複雑さが大幅に軽減されますvpath。これが実際の例です:

vpath %.cpp c
vpath %.h include

CPPFLAGS = -Iinclude

objs = CI_Metadata.o ConnectMxctl.o Block.o

tester: test_block.o $(objs)
        $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

$(objs): %.o: %.cpp %.h

ただし、この Makefile はまだ完全に壊れています。.cppファイルと対応するファイルの間の依存関係.hは定義されていますが、他のすべてのインクルード依存関係が欠落しています。これは、コンパイラを使用して依存関係を生成することで解決できますが (たとえば、 オプションを使用-MM)、Makefile が非常に複雑になります。

make を使用する必要がない場合は、最新のビルド ツールを使用することを強くお勧めします。C++ で開発しているため、boost-build (別名bjam ) を使用することをお勧めします。上記のは次JamrootのようMakefileになります。

exe tester : [ glob c/*.cpp ] : <include>include ;
于 2013-07-20T08:29:56.357 に答える