我有一个我个人没写过的makefile,而且我不太擅长bash脚本和makefile,所以请原谅我之前缺乏知识;
如标题所述,我只想在编译到../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.
答案 0 :(得分:3)
makefile规则由两部分组成,即规则依赖项的声明和要调用的命令。
在冒号后,规则的第一行列出了依赖关系,并且后续行中列出了要执行的命令,所有这些都使用制表符缩进。
您的安装规则需要依赖于您正在移动的程序以及可能的目标目录(您可能需要创建目标的规则),而不是mv
实用程序本身,因为您不需要建立那个。
install: $(PROGS)
mv $(PROGS) $(PROG_PATH)
请注意,虽然我使用了四个空格,但缩进需要是一个标签。你没有(但是?)有一个规则来制作PROG_PATH
,我把它从依赖列表中删除了。
另请注意,使用此规则,如果您调用make两次,则make必须重建您的程序。您想考虑使用cp
或install
代替mv
。