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