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

时间:2014-04-28 12:16:27

标签: c++ makefile

我有这个工作的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等等,最好的解决方案是什么?
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

2)真的不是那么糟糕:

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

可以避免使用这两个obj/前缀,但它确实不值得。