C++ 如何使用自动查找.cpp文件仅重新编译makefile中更改的内容?

C++ 如何使用自动查找.cpp文件仅重新编译makefile中更改的内容?,c++,makefile,C++,Makefile,我编写了以下makefile,它成功地将当前文件夹中的所有.cpp编译到一个静态库中。 之所以使用clean_库目标,是因为如果我尝试编译并且已经存在.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

我编写了以下makefile,它成功地将当前文件夹中的所有
.cpp
编译到一个静态库中。 之所以使用
clean_库
目标,是因为如果我尝试编译并且已经存在
.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_库
来实现这一点

没有这一点,我如何才能达到同样的行为

解决方法是创建一个为单个体系结构构建的目标,并仅在需要/工作完成时调用为所有体系结构构建的目标

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
CC=g++
FLAGS=-g-std=c++14-Wall-Wextra-O0#debug
#FLAGS=-std=c++14-Ofast#release
SRCS=$(通配符*.cpp)
OBJS=$(SRCS:.cpp=.o)
OUT=我的图书馆
$(OUT):$(OBJS)
应收账款rcs$(外)。a$^
#libtool-static-o$(OUT).a$^#其他可能性
%.o:%.cpp生成文件#清理_库
$(CC)$(标志)-c$<-o$@-arch x86\U 64-arch i386
.冒牌货:清洁图书馆
清洁:清洁图书馆
rm-rf*.o
清洁图书馆:
rm-rf$(输出)。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=g++
debug_FLAGS=-g-std=c++14-Wall-Wextra-O0
release_FLAGS=-std=c++14-Ofast
SRCS:=$(通配符*.cpp)
OBJS:=$(SRCS:.cpp=.o)
OUT:=我的图书馆
全部:调试/$(输出)发布/$(输出)
%/元(出):
ar rcs$@$^
#libtool-static-o$@$^#其他可能性
debug/$(OUT):$(addprefix debug/,$(OBJS))
调试/%.o:%.cpp生成文件|调试
$(CC)$(调试标志)-c$<-o$@-arch x86\u 64-arch i386
release/$(OUT):$(addprefix release/,$(OBJS))
release/%.o:%.cpp生成文件| release
$(CC)$(发布标志)-c$<-o$@-arch x86\U 64-arch i386
调试版本:
mkdir-p$@
清洁:
rm-rf调试版本
.PHONY:debug-release-clean

如果你想有很多不同的选择,也许值得花更多的时间,但如果你只想有两个,你可能不需要付出额外的努力。

你总是删除你的对象文件,因为你的
%.o
规则有一个先决条件,那就是执行clean。依次调用
rm
。只要删除先决条件,它就会按预期工作。您所说的是有效的,试图用一个最小的工作示例替换makefile我弄乱了一个关键点,我正在编辑答案