У меня есть make-файл, который я лично не писал, и я не очень хорош в bash-скриптинге и make-файлах в целом, поэтому простите меня за недостаток знаний заранее;
Как говорится в заголовке, я просто хочу переместить свои исполняемые файлы при компиляции в папку ../bin/. Моя попытка этого (беззастенчиво скопированная из другого поста здесь на SO) приведена ниже (т.е. я попытался сделать фиктивную установку, которая должна переместить файлы, но, увы, это не так. «
CXX = g++
CC = g++# Define preprocessor, compiler, and linker flags. Uncomment the # lines
# if you use clang++ and wish to use libc++ instead of libstd++.
CPPFLAGS = -std=c++11 -I..
CXXFLAGS = -g -O2 -Wall -W -pedantic-errors
CXXFLAGS += -Wmissing-braces -Wparentheses -Wold-style-cast
CXXFLAGS += -std=c++11
LDFLAGS = -g -L..
MV = mv
PROG_PATH = ../bin/
#CPPFLAGS += -stdlib=libc++
#CXXFLAGS += -stdlib=libc++
#LDFLAGS += -stdlib=libc++
# Libraries
#LDLIBS = -lclientserver
# Targets
PROGS = myserver myclient libclientserver.a
all: $(PROGS)
# Targets rely on implicit rules for compiling and linking
# The dependency on libclientserver.a is not defined.
myserver: myserver.o messagehandler.o server.o connection.o database_memory.o database_file.o
myclient: myclient.o connection.o server.o messagehandler.o
libclientserver.a: connection.o server.o
ar rv libclientserver.a connection.o server.o
ranlib libclientserver.a
# Phony targets
.PHONY: all install clean
all: $(PROGS) install
install: $(MV) $(PROGS) $(PROG_PATH)# Standard clean
clean:
rm -f *.o $(PROGS)
# Generate dependencies in *.d files
%.d: %.cc
@set -e; rm -f $@; \
$(CPP) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
# Include the *.d files
SRC = $(wildcard *.cc)
include $(SRC:.cc=.d)
Так как мне лучше всего это сделать? Компилятор говорит
make: *** No rule to make target `mv', needed by `install'. Stop.
Правило make-файла состоит из двух частей: объявления зависимостей правила и команд для вызова.
Зависимости перечислены в первой строке правила после двоеточия, а команды, которые нужно выполнить, перечислены в последующих строках с отступом табуляции.
Ваше правило установки должно зависеть от программ, которые вы перемещаете, и, возможно, от каталога назначения (вам может потребоваться правило, которое создает место назначения), но не от mv
сама утилита, поскольку вам не нужно это строить.
install: $(PROGS)
mv $(PROGS) $(PROG_PATH)
Обратите внимание, что хотя я использовал четыре пробела, отступ должен быть табуляцией. Поскольку у вас (еще?) Нет правила, чтобы сделать PROG_PATH
Я оставил это вне списка зависимостей.
Также обратите внимание, что с этим правилом make придется перестраивать ваши программы, если вы вызываете make дважды по мере их перемещения. Вы кстати хотите рассмотреть возможность использования cp
или же install
вместо mv
,