Улучшить Makefile - PullRequest
       0

Улучшить Makefile

2 голосов
/ 27 февраля 2020

У меня есть следующий 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 простых операторов?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

IMO autotools это way излишним для этого.

Вы можете сделать это довольно легко. Однако в вашем make-файле есть некоторые странные вещи.

Самое главное, что все ваши файлы имеют суффикс с расширением .c, что означает, что они являются C файлами, но вы компилируете их с g++, что компилятор C ++. Это не имеет смысла. Либо вы должны называть свои исходные файлы как файлы 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
0 голосов
/ 28 февраля 2020

Я использовал ответ, предложенный @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

Большое спасибо за всю полученную помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...