[英]make wants to know how to make target foo.cpp
以为我遵循了SO上其他地方找到的makefile的简单规定,但是当我使用此makefile时,它抱怨:
make: *没有规则来创建目标“ CI_Metadata.cpp”,这是“ CI_Metadata.o”所需的。 停止。
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
在这种情况下,可以在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 (aka bjam )。 上述Makefile
的Jamroot
如下所示:
exe tester : [ glob c/*.cpp ] : <include>include ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.