Makefile改进:几个可执行文件和目录

Makefile improvements: several executables & directories

本文关键字:可执行文件 几个 改进 Makefile      更新时间:2023-10-16

我有这个正在工作的Makefile,我想改进它:

CXX = g++
RM = rm -f
CXXFLAGS = -O2 -s -Wall -std=c++11
LDFLAGS = -Wl,-z,relro
SRCS = target1.cpp target2.cpp target3.cpp utils.cpp
OBJS = $(subst .cpp,.o,$(SRCS))
.PHONY: all target1 target2 target3 clean
all: target1 target2 target3
target1: target1.o utils.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS) 
target2: target2.o utils.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
target3: target3.o utils.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS) 
clean:
    $(RM) $(OBJS)

我的问题是:

  1. 每个目标都需要utils.o。是否可以避免为target1/target2/target3写入3次相同的行
  2. 我想分离源、对象和二进制文件(./中的Makefile,./中二进制文件,src/中的源,obj/中的对象)。为了避免写入target1: obj/target1.o obj/utils.o等等,最好的解决方案是什么

谢谢!

1)是的,您可以使用模式规则:

target%: target%.o utils.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)

2) 它真的没有那么糟糕:

target%: obj/target%.o obj/utils.o
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)

可以避免这两个obj/前缀,但这真的不值得麻烦。