2017-01-04 5 views
0

を依存して使用して、私はすべてのコード(.hpp.cppファイル)が含まれていmakefileの親ディレクトリこのmakefileオブジェクトファイル

appname := fun 

srcfiles := $(shell find .. -name "*.cpp") 
headerfiles := $(shell find .. -name "*.hpp") 
objects := $(patsubst %.cpp, %.o, $(srcfiles)) 


all: $(srcfiles) $(appname) 

$(appname): $(objects) 
    $(CXX) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS) 

depend: .depend 

.depend: $(srcfiles) $(headerfiles) 
    rm -f ./.depend 
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend; 

clean: 
    rm -f $(appname) $(objects) 

dist-clean: clean 
    rm -f *~ .depend 

include .depend 

を持っています。残念ながら、.oファイルはソースコードに保存されていますが、実行可能ファイル(およびmakefile)の同じディレクトリに保存されます。 Eclipse CDTのDefaultと同じです。

これを行うにはどうすればmakefileを変更できますか?

PS:thisのような同様の質問がありましたが、$(objects)タスクを定義するのにdependを使用していませんでした(それらはすべて%.o%形式です)。

答えて

1

objects変数を設定するときは、完全なパス名を.cppファイルに置き換え、接尾辞を.oに置き換えます。したがって、my/sub/dir/foo.cppのようなファイルがある場合、objectsにはパスmy/sub/dir/foo.oが含まれます。ですから、もちろん$(appname): $(objects)というルールを書くと、makeはmy/sub/dir/foo.oというファイルを作成しようとします。あなたはそれだけではなく、foo.oを構築したい場合は、同様の経路を取り除くために必要があり、単にサフィックス代わるものではありませ:今

objects := $(patsubst %.cpp,%.o,$(notdir $(srcfiles))) 

を、もちろん、それが構築する方法を知らないと言うだろう作りますデフォルトのルールでは.cppから.cppファイルを作成するのではなく、my/sub/dirという名前のファイルを作成するのではなく、から.oを作成する方法しかわかっていないためです。

この作品は、最も簡単な解決策はuse VPATHにあるので、同様にあなたは、あなたがsrcfilesからもらったディレクトリのリストからVPATHの値を構築することができようにするには:

VPATH := $(sort $(dir $(srcfiles))) 

あなたはまた、より良い依存関係を使用して検討するかもしれません例えば、the one described hereのような世代のソリューションです。

関連する問題