0

假设我有以下生成文件:

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。

谢谢。

4

1 回答 1

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就此而言。

编辑说明:使用它会更习惯,CXX而不是CC因为你有一个 C++ 程序。

于 2013-05-07T15:13:08.667 回答