make想知道如何制作目标foo.cpp

时间:2013-07-20 03:47:15

标签: c++ makefile

以为我在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

1 个答案:

答案 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