【问题标题】:Multiple sets of rules to convert .cpp files into .o files in makemake中多组规则将.cpp文件转换为.o文件
【发布时间】:2013-05-07 15:06:58
【问题描述】:

假设我有以下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 有没有办法为不同的文件集指定不同的规则,而不用拆分 目录树并使用递归生成。

谢谢。

【问题讨论】:

标签: makefile


【解决方案1】:

这些规则可能没有按照你的想法做:

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

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

$&lt; 扩展为规则的 first 先决条件,这意味着无论哪个源文件在 $(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++ 程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多