![](/img/trans.png)
[英]Makefile will link files upon a file change, but not recompile the source file that changed
[英]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.