我有以下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语句将“输出”目录中的所有目标文件编译在一起(现在我必须编译写入每个对象的对象,并且有很多对象)。我试图使用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
您知道如何仅使用5条简单的语句重写此Makefile以编译该文件吗?
IMO自动工具对此是[[way矫kill过正。
您可以很容易地做到这一点。但是,关于您的makefile有一些奇怪的事情。最重要的是,所有文件都带有.c
扩展名后缀,这意味着它们是C文件,但是您正在使用C ++编译器g++
对其进行编译。这根本不符合逻辑。您应该将源文件命名为C ++文件,这意味着.cc
或.cxx
或.cpp
或类似名称,或者您应该使用C编译器,例如gcc
而不是g++
。
我将基于文件扩展名假定您的代码是C代码。
请使用标准变量(CC
,CPPFLAGS
,CFLAGS
,LDLIBS
):
CC = gcc
CPPFLAGS = -I./vlfeat-0.9.21
CFLAGS = -Wall -O3
LDLIBS = -lopenblas -llapacke -lvl -lm
DIRS = texture utility svm
OBJDIR = output
SRCS := main.c $(wildcard $(addsuffix /*.c,$(DIRS)))
OBJS := $(addprefix $(OBJDIR)/,$(notdir $(SRCS)))
vpath %.c $(DIRS)
all: classification_scheme
classification_scheme: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
$(OBJDIR)/%.o : %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean:
rm -rf $(OBJDIR) *.model *.ppm *.txt classification_scheme
.PHONY: all clean
CXX=g++
CXXFLAGS = -Wall -O3
LDLIBS = -lm -lopenblas -llapacke -lvl
CPPFLAGS = -I./vlfeat-0.9.21
DIRS = texture utility svm .
OBJDIR = output
SRCS := $(wildcard $(addsuffix /*.cpp,$(DIRS)))
OBJS = $(addprefix $(OBJDIR)/,$(notdir $(patsubst %.cpp,%.o,$(SRCS))))
vpath %.cpp $(DIRS)
all: create_output_dir classification_scheme
classification_scheme: $(OBJS)
$(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
$(OBJDIR)/%.o : %.cpp
$(CXX) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
create_output_dir:
mkdir -p ${OBJDIR}
clean:
rm -rf $(OBJDIR) *.model *.ppm *.txt classification_scheme
.PHONY: all clean
非常感谢您提供的所有帮助。