说我有以下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。
感谢。
答案 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
是不恰当的。