C++ gnu制造。仅重新编译未更改的文件
请帮我弄一下makefile。我希望“make”只重新编译已更改的文件。这是我的makefile:C++ gnu制造。仅重新编译未更改的文件,c++,makefile,C++,Makefile,请帮我弄一下makefile。我希望“make”只重新编译已更改的文件。这是我的makefile: ROOT_DIR= .. BUILD_TYPE= Release BUILD_DIR= $(ROOT_DIR)/$(BUILD_TYPE) O_DIR= $(BUILD_DIR)/obj TARGETS= ftp_auto_backup sftp_auto_backup CXX= g++ CXXFLAGS= -DBOOST_THREAD_USE_LIB -O3 -Wall -fmessage-
ROOT_DIR= ..
BUILD_TYPE= Release
BUILD_DIR= $(ROOT_DIR)/$(BUILD_TYPE)
O_DIR= $(BUILD_DIR)/obj
TARGETS= ftp_auto_backup sftp_auto_backup
CXX= g++
CXXFLAGS= -DBOOST_THREAD_USE_LIB -O3 -Wall -fmessage-length=0
FTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
-l:libfile.a -l:libfilesearcher.a -l:libftpclient.a -l:libftplib.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libws2_32.a
SFTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \
-l:libfile.a -l:libfilesearcher.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libsftpclient.a -l:libws2_32.a -l:libssh.dll
OBJECTS= appconfig.o backuplauncher.o clientbackup.o main.o
LD_OBJECTS= $(addprefix $(O_DIR)/,$(OBJECTS))
all: init $(TARGETS)
debug: CXXFLAGS= -O0 -g3 -Wall -fmessage-length=0
debug: BUILD_TYPE= Debug
debug: all
init:
@mkdir -p $(BUILD_DIR)
@mkdir -p $(O_DIR)
ftp_auto_backup: set_type_ftp $(OBJECTS)
$(CXX) -o $(BUILD_DIR)/$@.exe $(LD_OBJECTS) $(FTP_LDFLAGS)
sftp_auto_backup: set_type_sftp $(OBJECTS)
$(CXX) -o $(BUILD_DIR)/$@.exe $(LD_OBJECTS) $(SFTP_LDFLAGS)
set_type_ftp:
$(eval CXXFLAGS+=-DPROJECT_TYPE=FTP)
set_type_sftp:
$(eval CXXFLAGS+=-DPROJECT_TYPE=SFTP)
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $(O_DIR)/$@
clean:
rm -rf $(addprefix $(ROOT_DIR)/Release/obj/,$(OBJECTS)) $(addprefix $(ROOT_DIR)/Debug/obj/,$(OBJECTS))
rm -rf $(addprefix $(ROOT_DIR)/Release/,$(addsuffix .exe,$(TARGETS))) $(addprefix $(ROOT_DIR)/Debug/,$(addsuffix .exe,$(TARGETS)))
根目录=。。
构建类型=发布
生成目录=$(根目录)/$(生成类型)
O_DIR=$(构建目录)/obj
目标=ftp自动备份sftp自动备份
CXX=g++
CXXFLAGS=-DBOOST\u THREAD\u USE\u LIB-O3-Wall-fmessage length=0
FTP_LDFLAGS=-static libstdc++-static libgcc-s-L$(ROOT_DIR)/lib/Release-L:libboost_thread-mgw46-mt-1_49.a-L:libcommon.a\
-l:libfile.a-l:libfilesearch.a-l:libftpclient.a-l:libftplib.a-l:libdbclient.a-l:libsqlite3.a-l:libscheduler.a-l:libws2_32.a
SFTP_LDFLAGS=-static libstdc++-static libgcc-s-L$(ROOT_DIR)/lib/Release-L:libboost_thread-mgw46-mt-1_49.a-L:libcommon.a\
-l:libfile.a-l:libfilesearch.a-l:libdbclient.a-l:libsqlite3.a-l:libscheduler.a-l:libsftpclient.a-l:libws2_32.a-l:libssh.dll
OBJECTS=appconfig.o backuplauncher.o clientbackup.o main.o
LD_OBJECTS=$(addprefix$(O_DIR)/,$(OBJECTS))
全部:初始$(目标)
调试:cxflags=-O0-g3-Wall-fmessage length=0
调试:构建类型=调试
调试:全部
初始化:
@mkdir-p$(构建目录)
@mkdir-p$(O_DIR)
ftp\自动\备份:设置\类型\ ftp$(对象)
$(CXX)-o$(BUILD\u DIR)/$@.exe$(LD\u对象)$(FTP\u LDFLAGS)
sftp_自动_备份:设置_类型_sftp$(对象)
$(CXX)-o$(BUILD\u DIR)/$@.exe$(LD\u对象)$(SFTP\u LDFLAGS)
设置\u类型\u ftp:
$(eval cxflags+=-DPROJECT\u TYPE=FTP)
设置\u类型\u sftp:
$(评估CXXFLAGS+=-D项目类型=SFTP)
%.o:%.cpp
$(CXX)-c$(CXXFLAGS)$<-o$(o\U DIR)/$@
清洁:
rm-rf$(addprefix$(ROOT\u DIR)/Release/obj/,$(OBJECTS))$(addprefix$(ROOT\u DIR)/Debug/obj/,$(OBJECTS))
rm-rf$(addprefix$(ROOT\u DIR)/Release/,$(addsuffix.exe,$(TARGETS)))$(addprefix$(ROOT\u DIR)/Debug/,$(addsuffix.exe,$(TARGETS)))
是的,我知道,但我真的应该用它吗?
提前谢谢 您的目标依赖于当前目录中的对象,而不是obj/中的对象。更改为:
ftp_auto_backup: set_type_ftp $(LD_OBJECTS)
$(CXX) -o $(BUILD_DIR)/$@.exe $(LD_OBJECTS) $(FTP_LDFLAGS)
sftp_auto_backup: set_type_sftp $(LD_OBJECTS)
$(CXX) -o $(BUILD_DIR)/$@.exe $(LD_OBJECTS) $(SFTP_LDFLAGS)
# (...)
$(O_DIR)/%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
ftp\u自动备份:设置\u类型\u ftp$(LD\u对象)
$(CXX)-o$(BUILD\u DIR)/$@.exe$(LD\u对象)$(FTP\u LDFLAGS)
sftp\U自动\U备份:设置\U类型\U sftp$(LD\u对象)
$(CXX)-o$(BUILD\u DIR)/$@.exe$(LD\u对象)$(SFTP\u LDFLAGS)
# (...)
$(O_DIR)/%.O:%.cpp
$(CXX)-c$(CXXFLAGS)$<-o$@
是的,如果您不仅希望在更改.cpp文件时重新编译对象文件,而且还希望在更改头(.h)文件时重新编译对象文件,则需要生成这些先决条件…我认为,%.o:%.cpp还不够,您应该使用VPATH让make知道源的位置:
vpath %.cpp src
我不知道你为什么不使用内置目标。此外,您的一些虚假目标,如
all
和debug
没有标记为。虚假
。旁注:除了询问我们您当前的目标外,您还应该告诉我们您试图实现的总体目标是什么?制作文件的内容非常。。。嗯。。。我会说,非正统。@STATUS\u ACCESS\u DENIED什么是内置目标?我不使用。假的,因为我这次不需要它。>>总体而言,您想要实现的目标是什么?我想从相同的源文件构建两个功能不同的应用程序版本。>>制作文件的内容非常。。。嗯。。。我认为这是非正统的。你到底是怎么想的?)非常感谢,这就解决了这个问题!我的错,现在真的需要睡一会儿了)