繁体   English   中英

使想要知道如何使目标foo.cpp

[英]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 )。 上述MakefileJamroot如下所示:

exe tester : [ glob c/*.cpp ] : <include>include ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM