以为我在SO上的其他地方找到了一个简单的makefile文件,但是当我使用这个makefile时,它会抱怨:
make: * 没有规则来制作'CI_Metadata.o'所需的目标'CI_Metadata.cpp'。停止。
OTHER_INCLUDES+=-I${PWD}/include -I/usr/local/include
all: CI_Metadata.o ConnectMxctl.o Block.o test_block.o
g++ -o tester CI_Metadata.o ConnectMxctl.o Block.o test_block.o
ConnectMxctl.o: ConnectMxctl.cpp ConnectMxctl.h
g++ -c $(OTHER_INCLUDES) ConnectMxctl.cpp
CI_Metadata.o: CI_Metadata.cpp CI_Metadata.h
g++ -c $(OTHER_INCLUDES) CI_Metadata.cpp
Block.o: Block.cpp Block.h
g++ -c $(OTHER_INCLUDES) Block.cpp
test_block.o: test_block.cpp
g++ -c $(OTHER_INCLUDES) test_block.cpp
答案 0 :(得分:1)
您可以在GNU make的情况下使用指令vpath
。与没有vpath
的Makefile相比,它显着降低了复杂性。这是一个有效的例子:
vpath %.cpp c
vpath %.h include
CPPFLAGS = -Iinclude
objs = CI_Metadata.o ConnectMxctl.o Block.o
tester: test_block.o $(objs)
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
$(objs): %.o: %.cpp %.h
然而,这个Makefile仍然完全坏了。定义了.cpp
文件和相应的.h
文件之间的依赖关系,但缺少所有其他包含依赖关系。可以使用编译器来解决它以生成依赖项(例如使用选项-MM
),但它会使Makefile非常复杂。
如果您不必使用make,我强烈建议您使用现代构建工具。因为您正在使用C ++进行开发,所以我建议使用boost-build(又名 bjam )。上述Jamroot
的{{1}}如下所示:
Makefile