C++ gnu制造。仅重新编译未更改的文件

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-

请帮我弄一下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-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什么是内置目标?我不使用。假的,因为我这次不需要它。>>总体而言,您想要实现的目标是什么?我想从相同的源文件构建两个功能不同的应用程序版本。>>制作文件的内容非常。。。嗯。。。我认为这是非正统的。你到底是怎么想的?)非常感谢,这就解决了这个问题!我的错,现在真的需要睡一会儿了)