Makefile将程序移动到特定目录

时间:2015-04-05 15:39:27

标签: c++ bash makefile mv

我有一个我个人没写过的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.

1 个答案:

答案 0 :(得分:3)

makefile规则由两部分组成,即规则依赖项的声明和要调用的命令。

在冒号后,规则的第一行列出了依赖关系,并且后续行中列出了要执行的命令,所有这些都使用制表符缩进。

您的安装规则需要依赖于您正在移动的程序以及可能的目标目录(您可能需要创建目标的规则),而不是mv实用程序本身,因为您不需要建立那个。

install: $(PROGS)
    mv $(PROGS) $(PROG_PATH)

请注意,虽然我使用了四个空格,但缩进需要是一个标签。你没有(但是?)有一个规则来制作PROG_PATH,我把它从依赖列表中删除了。

另请注意,使用此规则,如果您调用make两次,则make必须重建您的程序。您想考虑使用cpinstall代替mv