多组规则将.cpp文件转换为make中的.o文件

时间:2013-05-07 15:06:58

标签: makefile

说我有以下makefile:

SRC = trav.cpp
LSRC = node.cpp tree.cpp
LIB = lib/libvtree.so

OBJS = $(patsubst %.cpp,obj/%.o,$(SRC))
LOBJS = $(patsubst %.cpp,obj/%.o,$(LSRC))


$(LOBJS) : $(LSRC)
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : $(SRC)
      $(CC) -o $@ -c $<

$(LIB) : $(LOBJS)
      $(CC) -shared -o $@ $(LOBJS) $^

trav.exe: $(LOBJS) $(OBJS) $(LIB)
      $(CC) -o $@ $(LFLAGS) $(OBJS) -Llib libvtree -lstdc++

基本上,我正在尝试编译2组cpp文件:$(LSRC)到库中,$(SRC)编译成链接到该库的可执行文件。

但是当我尝试“制作”它时,我收到以下错误:

gcc -fPIC -o obj/node.o -g -DMEMPOOL -c src/node.cpp
gcc -fPIC -o obj/tree.o -g -DMEMPOOL -c src/node.cpp

它一直在尝试将node.cpp编译到.o文件中。

make中是否有一种方法可以为不同的文件集指定单独的规则,而不需要拆分 目录树和使用递归make。

感谢。

1 个答案:

答案 0 :(得分:2)

这些规则可能不符合您的想法:

$(LOBJS) : $(LSRC)
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : $(SRC)
      $(CC) -o $@ -c $<

$<扩展到规则的第一个先决条件,这意味着$(SRC)列表中的第一个源文件。你不希望这样,事实上它可能是对依赖关系的误解 - node.o不依赖于tree.cpp,对吗?

要使其工作,您希望它们是模式规则,以将特定对象与特定源文件匹配。

$(LOBJS) : obj/%.o : %.cpp
      $(CC) -fPIC -o $@ -c $<

$(OBJS) : obj/%.o : %.cpp
      $(CC) -o $@ -c $<

您可能还需要src/,但我看不到原始文件中的位置。就此而言-g -DMEMPOOL也是如此。

编辑说明:因为你有一个C ++程序所以使用CXX而不是CC是不恰当的。