0

以为我在遵循 SO 上其他地方的 makefile 的简单处方,但是当我使用这个 makefile 时,它​​抱怨:

制作:*没有规则来制作“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
4

1 回答 1

1

vpath在这种情况下,您可以通过 GNU make使用该指令。与没有vpath. 这是一个工作示例:

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上面的看起来Makefile如下:

exe tester : [ glob c/*.cpp ] : <include>include ;
于 2013-07-20T08:29:56.357 回答