改善Makefile

问题描述 投票:2回答:2

我有以下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以编译该文件吗?

makefile
2个回答
1
投票

IMO自动工具对此是[[way矫kill过正。

您可以很容易地做到这一点。但是,关于您的makefile有一些奇怪的事情。

最重要的是,所有文件都带有.c扩展名后缀,这意味着它们是C文件,但是您正在使用C ++编译器g++对其进行编译。这根本不符合逻辑。您应该将源文件命名为C ++文件,这意味着.cc.cxx.cpp或类似名称,或者您应该使用C编译器,例如gcc而不是g++

我将基于文件扩展名假定您的代码是C代码。

请使用标准变量(CCCPPFLAGSCFLAGSLDLIBS):

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


0
投票
我已经使用@MadScientist提出的答案来创建适合我需要的Makefile。这是:

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

非常感谢您提供的所有帮助。
© www.soinside.com 2019 - 2024. All rights reserved.