我对Makefiles很陌生。我一直在为与WiringPi相关的项目使用WiringPi制作一个简单的RaspberyPi库。到目前为止,它非常简单的事情,如发光二极管类,DuelLED,汽车,按钮等(包括.h和.cpp)。我能够拼凑一个Makefile,但是我得到了一个错误“RumPi不需要目标RumPi.o的规则”。
感谢您的帮助,下面是最后的修复程序:
CXX = g++
CXXFLAGS = -std=c++11
LDLIBS = -lwiringPi
HEADERS = Components/Headers/RumPi.h ./Common.h Components/Headers/Component.h Components/Headers/Vehicle.h Components/Headers/Motor.h Components/Headers/Receiver.h Components/Headers/DualLED.h Components/Headers/LED.h Components/Headers/RGBLED.h Components/Headers/Relay.h
OBJECTS = RumPi.o Vehicle.o Motor.o Receiver.o DualLED.o LED.o RGBLED.o Relay.o
default: RumPi
RumPi: $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) -o $@
%.o: Components/Implementations/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(OBJECTS): $(HEADERS)
clean:
-rm -f $(OBJECTS)
-rm -f RumPi发布于 2017-11-12 04:21:32
该消息意味着make无法确定如何构建该目标(RumPi.o)。你有Components/Implementations/RumPi.cpp文件吗?您在$(HEADERS)变量中列出的所有头文件是否都存在?如果其中任何一个不是真,那么您的模式规则将不匹配。如果模式规则不匹配(默认规则不匹配),则make无法确定如何构建对象文件。
如果需要完整的详细信息,可以运行make -d并检查调试输出。您可能希望将其重定向到一个文件,这样您就可以使用less或文本编辑器查看它,因为有很多输出。
顺便说一下,您不应该将-lwiringPi选项添加到编译行中。库只在链接时使用,而不是在编译时使用。
埃塔
您应该考虑的其他事情是重写模式规则,以便只列出源文件作为先决条件,并将标头移到单独的行:
%.o: Components/Implementations/%.cpp
gcc -c $< -o $@ -lwiringPi
$(OBJECTS): $(HEADERS)这样做的好处是,如果找不到其中一个标头,您将得到更清晰的错误消息。当您使用模式规则时,make将尝试匹配它能够匹配的所有模式,如果没有匹配,它将告诉您它不知道如何构建目标。由于构建目标通常有许多不同的方法,所以make并不会对不匹配的每个目标都显示错误。
但是,如果您声明了两个文件之间的直接显式先决条件关系,而不是使用可能匹配或可能不匹配的模式,那么如果缺少一个文件make将直接告诉您。
ETA2
在原始makefile中,有这样一个规则:
RumPi: $(OBJECTS)
gcc $(OBJECTS) -o $@ -lwiringPi但后来你把它移走了。你为什么要把这个拿出来?您需要这个规则来告诉make如何链接您的可执行文件RumPi。
另外,您不应该使用gcc作为C++代码的编译器/链接器;gcc用于C,而不是C++。您应该将g++用于C++代码。最好将这些信息包含在变量中,这样就很容易找到和修改(即使是在命令行中)。C++编译器的标准变量名是CXX等。
生成文件应该如下所示:
CXX = g++
CXXFLAGS = -std=c++11
LDLIBS = -lwiringPi
HEADERS = Components/Headers/RumPi.h ./Common.h Components/Headers/Component.h \
Components/Headers/Vehicle.h Components/Headers/Motor.h Components/Headers/Receiver.h \
Components/Headers/DualLED.h Components/Headers/LED.h Components/Headers/RGBLED.h \
Components/Headers/Relay.h
OBJECTS = RumPi.o Vehicle.o Motor.o Receiver.o DualLED.o LED.o RGBLED.o Relay.o
default: RumPi
RumPi: $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) -o $@
%.o: Components/Implementations/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(OBJECTS): $(HEADERS)
clean:
-rm -f $(OBJECTS)
-rm -f RumPihttps://stackoverflow.com/questions/47244709
复制相似问题