2016-04-05 7 views
1

私は自分のプロジェクト内のすべてのファイルをコンパイルしてリンクするmakefileを書きました。現在、私は2つのcppファイルしか持っていません:src/main.cppsrc/DBEngine/benchmark/ssb/ssb_main.cppです。一般的なmakefileは、ターゲットエラーを作るためのルールを示さない

私のメイクファイルの内容は次のとおりです。

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(addprefix bin/obj/,$(notdir $(CPP_FILES:.cpp=.o))) 
DEBUG_OBJ_FILES := $(addprefix bin/debug/,$(notdir $(CPP_FILES:.cpp=.o))) 
CC_FLAGS := -I${PWD} 

main.out: $(OBJ_FILES) 
    g++ -o [email protected] $(OBJ_FILES) 

bin/obj/%.o: src/%.cpp 
g++ -c -o [email protected] $< (CC_FLAGS) -w 

しかし、ときに私はそれがエラーを与えるメイク行います

メイク:main.outが必要とする対象bin/debug/ssb_main.oを作るために***はありませんルールを。やめる。

答えて

1

ショートバージョン:あなたのパターンルールは、あなたがそれは私が確信している動作しませんどのように見ることができますDBEngine

bin/obj/ssb_main.o: src/ssb_main.cpp 

のオブジェクトファイルに対して、次のように展開されます。

あなたはそれが

bin/obj/%.o: src/DBEngine/benchmark/ssb/%.cpp 
    g++ -c -o [email protected] $< $(CC_FLAGS) -w 

簡単な方法は、しかし、あなたのソースをミラーリングし、木を構築し、vpathを使用し、同様にメイクファイルのディレクトリにDBEngine/benchmark/ssbというディレクトリがあることを確認することです解決するために、別のパターンルールを追加することができます以下を使用してください:

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(CPP_FILES:src/%.cpp=%.o) 
CPPFLAGS := -I${PWD} 
CXXFLAGS := -w 

vpath %.cpp src 

main: $(OBJ_FILES) 

組み込みのルールは残りの部分を処理します。

サイドノート:-I${PWD}は余計ですが、-wは通常悪い考えです。

+0

詳細な回答がありがとうございます。 –

1

コンパイルルールでは、ソースファイルが 'src'ディレクトリに指定されています。しかし、あなたの説明から、ssb_main.cppファイルは 'src/DBEngine/benchmark/ssb /'フォルダにあるようですので、はssb_main.oをコンパイルする依存関係が見つかりません。

ソースファイルを探す必要があるフォルダを変数VPATHで指定することができます。

0

あなたはサブフォルダを持っているので、あなたはそれがsrcとを除くそのサブフォルダの下にあるすべてのcppファイルを一覧表示します

CPP_FILES := $(shell ls -pR ./src | grep -v /) 

を使用しようとすることができ、あなたのsrcフォルダです。そして..

+0

こんにちはls -A -R src/*。cppはsrc/DBEngine/benchmark/ssb/ssb_main.cppファイルを見つけることができません –

+0

lsコマンドを少し変更しました。 srcフォルダとサブフォルダにあるすべてのファイルが一覧に表示されるはずです – NeoSer

関連する問題