2017-08-23 9 views
1

私はC++で(ダイナミックな)ライブラリを作成しており、そのための一連のテストをしています。現在、ライブラリをビルドするかテストをビルドして実行することができるmakefile(デフォルトターゲット)を使っています(testターゲット)。全体の違いは、いくつかの理由で、依存関係リストが更新されないので、ファイル(mainを含む)が含まれているかどうかにかかわらず、testターゲットを正しくビルドすることができません。ソースファイルを追加してメイクファイルの依存関係を更新する

あなたが前提条件のリストにターゲット固有の変数の値を使用することはできません
CXX = g++ 
RM=rm -f 

EXTRA_CCFLAGS = -Wall -Wextra -Wcast-qual -Wfloat-equal -Wpedantic -Wpointer-arith -Wshadow 
CXXOPTFLAGS  = -O2 
CXXFLAGS  = -std=c++11 $(EXTRA_CCFLAGS) $(CXXOPTFLAGS) 

LDLIBS=-larmadillo 
MAKELIBFLAGS=-current_version 0.1 -compatibility_version 0.1 -dynamiclib 

TARGET = libadsp.dylib 
TESTTARGET = dsptest 
SOURCE_FILES=src/stft.cpp src/filters.cpp src/windows.cpp src/helpers.cpp 
OBJECT_FILES=$(subst .cpp,.o,$(SOURCE_FILES)) 

all: $(TARGET) 

test: SOURCE_FILES += tests/tests.cpp 
test: OBJECT_FILES = $(subst .cpp,.o,$(SOURCE_FILES)) 
test: $(TESTTARGET) 

$(TARGET): $(OBJECT_FILES) 
    $(CXX) $(CXXFLAGS) $(MAKELIBFLAGS) -o $(TARGET) $(OBJECT_FILES) $(LDLIBS) 

$(TESTTARGET): $(OBJECT_FILES) 
    $(CXX) $(CXXFLAGS) -o $(TESTTARGET) $(OBJECT_FILES) $(LDLIBS) 
    ./dsptest 

depend: .depend 

.depend: $(SOURCE_FILES) 
    $(RM) ./.depend 
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend; 

.PHONY: clean 

clean: 
    $(RM) $(OBJECT_FILES) 
    $(RM) ./.depend 

include .depend 
+0

通常、 'make'は物事を実行するのではなく、物事を実行するために使われます(私はmakeの副作用のファンではありません)。つまり、あなたはあなたのテストやあなたの定期的なビルドをすることができるようにしたいと言われています。 1つの注意:あなたはいつもあなたの '.depend'ファイルを再構築しています。これが大規模なプロジェクトだった場合、ビルド時間が短縮されます。より良い方法は、ターゲット固有のオブジェクトディレクトリを作成し、そこにコンパイルするときにソースごとに.dファイルを生成することです。このリンク:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/]には説明があります。 – blackghost

答えて

2

:ここ は全体のメイクファイルです。 GNU makeマニュアルは、これに関するvery clearです。

他の例外はターゲット固有の変数値です。この機能では、makeが現在構築しているターゲットに基づいて、同じ変数に対して異なる値を定義することができます。 自動変数と同様に、これらの値はターゲットのレシピのコンテキスト内(および他のターゲット固有の割り当て内)でのみ使用できます。

(強調が加えられる)。具体的にテストターゲットを追加することができます:

$(TESTTARGET): $(OBJECT_FILES) tests/tests.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS) 
     ./dsptest 

PS拡張子の置き換えに$(subst ...)を使用することはお勧めしません。代わりに$(patsubst ...)を使用してください。

+0

明確にするために、この解決策では、ターゲット固有の変数として 'OBJECT_FILES'を変更する必要があります。 (そして、わかりやすくするために、私はそれを変えることに賛成するだろう) – Beta

+0

あなたは正しい、それは私の悪かった。とにかく正しい自動変数を使用するように修正されました。これにより、OBJECT_FILESをターゲット固有の変数にすることを避けることができます。 – MadScientist

関連する問題