【问题标题】:gnu make. recompile unchanged files onlygnu 制作。仅重新编译未更改的文件
【发布时间】:2012-04-20 05:39:44
【问题描述】:

请帮我制作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)))

是的,我知道Generating Prerequisites Automatically,但我真的应该使用它吗? 提前致谢!

【问题讨论】:

  • 我不知道你为什么不使用内置目标。此外,您的一些虚假目标,例如alldebug 未标记为.PHONY
  • 旁注:除了向我们询问您的近期目标之外,您或许应该告诉我们您想要实现的总体目标是什么? make 文件的内容非常...呃...非正统,我会说。
  • @STATUS_ACCESS_DENIED 你的意思是什么内置目标?我不使用 .PHONY,因为这次我不需要它。 >> 您想要实现的总体目标是什么?我想构建具有不同功能但来自相同源文件的两个版本的应用程序。 >> make 文件的内容非常...呃...非正统,我会说。究竟是什么让你这么认为?)

标签: c++ makefile


【解决方案1】:

您的目标取决于当前目录中的对象,而不是 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 $@

是的,如果您希望目标文件不仅在更改 .cpp 文件时重新编译,而且在更改头 (.h) 文件时重新编译,您需要生成这些先决条件...

【讨论】:

  • 非常感谢,这解决了问题!我的错,现在真的需要睡一会儿)
【解决方案2】:

我认为 %.o : %.cpp 是不够的,你应该使用 VPATH 来让知道来源在哪里:

vpath %.cpp src

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多