簡體   English   中英

如何只重新編譯makefile中的更改並自動查找.cpp文件?

[英]How to recompile only what changed in makefile with automatically finds .cpp files?

我編寫了以下makefile,該文件成功將當前文件夾中的所有.cpp編譯到靜態庫中。 使用clean_library目標是因為如果我嘗試編譯並且已經存在.a文件,則編譯將因以下錯誤而停止:

ar: libbackend.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: libbackend.a: Inappropriate file type or format
make: *** [libbackend] Error 1

我想加快僅編譯那些更改的.cpp的編譯速度。 當前,所有.o文件每次都會重新創建。 我能實現這個去掉-arch部分並移除依賴clean_library

沒有該如何實現相同的行為?

一種解決方法是創建一個為單個體系結構構建的目標,並僅在需要時/工作完成時調用為所有體系結構構建的目標。

CC = g++
FLAGS = -g -std=c++14 -Wall -Wextra -O0 #debug
# FLAGS = -std=c++14 -Ofast # release

SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
OUT = my_library

$(OUT): $(OBJS)
    ar rcs $(OUT).a $^
# libtool -static -o $(OUT).a $^ #other possibilty

%.o: %.cpp Makefile #clean_library
    $(CC) $(FLAGS) -c $< -o $@ -arch x86_64 -arch i386

.PHONY: clean clean_library

clean: clean_library
    rm -rf *.o

clean_library:
    rm -rf $(OUT).a

您對要做什么不太清楚。 您的目標是以不同的方式多次編譯相同的代碼嗎?

您不能以完全相同的方式用不同的方式編譯目標,而僅更新已修改的文件:make無法知道以哪種方式編譯現有的目標文件。 當make啟動並看到foo.o文件時,它是否已編譯以進行調試? 發布? 沒有辦法知道,所以這行不通。 您必須重新編譯所有內容才能確定。

人們要做的就是將不同類型的編譯的輸出命名為不同的名稱。 最常見的方法是使用子目錄:將為調試而編譯的所有文件都放在debug子目錄中,並將為發布而編譯的所有文件都放在release子目錄中。 因此,您的makefile如下所示:

CC = g++
debug_FLAGS = -g -std=c++14 -Wall -Wextra -O0
release_FLAGS = -std=c++14 -Ofast

SRCS := $(wildcard *.cpp)
OBJS := $(SRCS:.cpp=.o)
OUT := my_library.a

all: debug/$(OUT) release/$(OUT)

%/$(OUT):
        ar rcs $@ $^
# libtool -static -o $@ $^ #other possibilty

debug/$(OUT): $(addprefix debug/,$(OBJS))

debug/%.o: %.cpp Makefile | debug
        $(CC) $(debug_FLAGS) -c $< -o $@ -arch x86_64 -arch i386

release/$(OUT): $(addprefix release/,$(OBJS))

release/%.o: %.cpp Makefile | release
        $(CC) $(release_FLAGS) -c $< -o $@ -arch x86_64 -arch i386

debug release:
        mkdir -p $@

clean:
        rm -rf debug release

.PHONY: debug release clean

如果您想擁有許多不同的選擇,可能值得花更多的錢,但是對於只有兩個的人,您可能不需要付出額外的努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM