У меня есть следующий Makefile:
CPLUS=g++
CFLAGS = -Wall -O3
LIBS = -lm -lopenblas -llapacke -lvl
HEADERS = -I./vlfeat-0.9.21
all: classification_scheme
classification_scheme: ./output/main.o ./output/trainpredict.o ./output/svm.o ./output/general_utilities.o ./output/postprocess.o ./output/preprocess.o \
./output/load_data.o ./output/data_structures.o ./output/slic.o ./output/texture_pipelines.o ./output/kmeans.o ./output/vlad.o ./output/bow.o ./output/gmm.o \
./output/fishervectors.o ./output/sift.o ./output/dsift.o
$(CPLUS) $(CFLAGS) -o classification_scheme ./output/trainpredict.o ./output/texture_pipelines.o ./output/slic.o ./output/svm.o ./output/general_utilities.o \
./output/postprocess.o ./output/preprocess.o ./output/load_data.o ./output/data_structures.o ./output/kmeans.o ./output/vlad.o ./output/bow.o ./output/gmm.o \
./output/fishervectors.o ./output/sift.o ./output/dsift.o ./output/main.o $(LIBS)
./output/main.o: main.c ./output/texture_pipelines.o ./output/preprocess.o
$(CPLUS) $(CFLAGS) $(HEADERS) -c -o ./output/main.o main.c
./output/trainpredict.o: ./svm/trainpredict.h ./svm/trainpredict.c ./output/svm.o
$(CPLUS) $(CFLAGS) $(HEADERS) -c -o ./output/trainpredict.o ./svm/trainpredict.c
./output/svm.o: ./svm/svm.cpp ./svm/svm.h
$(CPLUS) $(CFLAGS) -o ./output/svm.o -c ./svm/svm.cpp
./output/load_data.o: ./utility/load_data.c ./utility/load_data.h
$(CPLUS) $(CFLAGS) -c ./utility/load_data.c -o ./output/load_data.o
./output/data_structures.o: ./utility/data_structures.c ./utility/data_structures.h
$(CPLUS) $(CFLAGS) -c ./utility/data_structures.c -o ./output/data_structures.o
./output/preprocess.o: ./utility/preprocess.c ./utility/preprocess.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./utility/preprocess.c -o ./output/preprocess.o
./output/postprocess.o: ./utility/postprocess.c ./utility/postprocess.h
$(CPLUS) $(CFLAGS) -c ./utility/postprocess.c -o ./output/postprocess.o
./output/general_utilities.o: ./utility/general_utilities.c ./utility/general_utilities.h
$(CPLUS) $(CFLAGS) -c ./utility/general_utilities.c -o ./output/general_utilities.o
./output/slic.o: ./texture/slic.cpp ./texture/slic.h
$(CPLUS) $(CFLAGS) -c ./texture/slic.cpp -o ./output/slic.o
./output/texture_pipelines.o: ./texture/texture_pipelines.cpp ./texture/texture_pipelines.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./texture/texture_pipelines.cpp -o ./output/texture_pipelines.o
./output/kmeans.o: ./texture/kmeans.cpp ./texture/kmeans.h
$(CPLUS) $(CFLAGS) -c ./texture/kmeans.cpp -o ./output/kmeans.o
./output/vlad.o: ./texture/vlad.cpp ./texture/vlad.h
$(CPLUS) $(CFLAGS) -c ./texture/vlad.cpp -o ./output/vlad.o
./output/bow.o: ./texture/bow.cpp ./texture/bow.h
$(CPLUS) $(CFLAGS) -c ./texture/bow.cpp -o ./output/bow.o
./output/gmm.o: ./texture/gmm.cpp ./texture/gmm.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./texture/gmm.cpp -o ./output/gmm.o
./output/fishervectors.o: ./texture/fishervectors.cpp ./texture/fishervectors.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./texture/fishervectors.cpp -o ./output/fishervectors.o
./output/sift.o: ./texture/sift.cpp ./texture/sift.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./texture/sift.cpp -o ./output/sift.o
./output/dsift.o: ./texture/dsift.cpp ./texture/dsift.h
$(CPLUS) $(CFLAGS) $(HEADERS) -c ./texture/dsift.cpp -o ./output/dsift.o
clean:
rm -Rf ./output/* *.model *.ppm *.txt classification_scheme
Как вы можете видеть, я новичок в Makefile и изо всех сил пытался улучшить это, но не смог. У меня есть структура каталогов, подобная этой:
+\
|
--texture: directory with sources to compile
|
--utility: directory with sources to compile
|
--svm: directory with sources to compile
|
--output: directory where the objects compiled are placed before they get together
|
--vlfeat: directory with headers
|
--main.c: source to compile
|
--Makefile
Я хочу скомпилировать исходники в каждом каталоге, используя один оператор Makefile для каждого каталога (теперь я должен скомпилировать каждый исходный файл с независимым оператором). И затем я хочу использовать другой оператор Makefile для компиляции всех объектных файлов в каталоге «output» (теперь мне нужно скомпилировать объекты, записав каждый из них, и их много). Я пытался использовать функцию wildcar
, но мне не удавалось хорошо работать.
А это вывод make clean all
:
rm -Rf ./output/* *.model *.ppm *.txt classification_scheme
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./texture/texture_pipelines.cpp -o ./output/texture_pipelines.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./utility/preprocess.c -o ./output/preprocess.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c -o ./output/main.o main.c
g++ -Wall -O3 -o ./output/svm.o -c ./svm/svm.cpp
g++ -Wall -O3 -I./vlfeat-0.9.21 -c -o ./output/trainpredict.o ./svm/trainpredict.c
g++ -Wall -O3 -c ./utility/general_utilities.c -o ./output/general_utilities.o
g++ -Wall -O3 -c ./utility/postprocess.c -o ./output/postprocess.o
g++ -Wall -O3 -c ./utility/load_data.c -o ./output/load_data.o
g++ -Wall -O3 -c ./utility/data_structures.c -o ./output/data_structures.o
g++ -Wall -O3 -c ./texture/slic.cpp -o ./output/slic.o
g++ -Wall -O3 -c ./texture/kmeans.cpp -o ./output/kmeans.o
g++ -Wall -O3 -c ./texture/vlad.cpp -o ./output/vlad.o
g++ -Wall -O3 -c ./texture/bow.cpp -o ./output/bow.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./texture/gmm.cpp -o ./output/gmm.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./texture/fishervectors.cpp -o ./output/fishervectors.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./texture/sift.cpp -o ./output/sift.o
g++ -Wall -O3 -I./vlfeat-0.9.21 -c ./texture/dsift.cpp -o ./output/dsift.o
g++ -Wall -O3 -o classification_scheme ./output/trainpredict.o ./output/texture_pipelines.o ./output/slic.o ./output/svm.o ./output/general_utilities.o \
./output/postprocess.o ./output/preprocess.o ./output/load_data.o ./output/data_structures.o ./output/kmeans.o ./output/vlad.o ./output/bow.o ./output/gmm.o \
./output/fishervectors.o ./output/sift.o ./output/dsift.o ./output/main.o -lm -lopenblas -llapacke -lvl
Знаете ли вы, как переписать этот Makefile, чтобы скомпилировать эти файлы, используя только 5 простых операторов?