首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WiringPi的简单生成文件

使用WiringPi的简单生成文件
EN

Stack Overflow用户
提问于 2017-11-12 01:57:42
回答 1查看 1.7K关注 0票数 0

我对Makefiles很陌生。我一直在为与WiringPi相关的项目使用WiringPi制作一个简单的RaspberyPi库。到目前为止,它非常简单的事情,如发光二极管类,DuelLED,汽车,按钮等(包括.h和.cpp)。我能够拼凑一个Makefile,但是我得到了一个错误“RumPi不需要目标RumPi.o的规则”。

感谢您的帮助,下面是最后的修复程序:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-12 04:21:32

该消息意味着make无法确定如何构建该目标(RumPi.o)。你有Components/Implementations/RumPi.cpp文件吗?您在$(HEADERS)变量中列出的所有头文件是否都存在?如果其中任何一个不是真,那么您的模式规则将不匹配。如果模式规则不匹配(默认规则不匹配),则make无法确定如何构建对象文件。

如果需要完整的详细信息,可以运行make -d并检查调试输出。您可能希望将其重定向到一个文件,这样您就可以使用less或文本编辑器查看它,因为有很多输出。

顺便说一下,您不应该将-lwiringPi选项添加到编译行中。库只在链接时使用,而不是在编译时使用。

埃塔

您应该考虑的其他事情是重写模式规则,以便只列出源文件作为先决条件,并将标头移到单独的行:

代码语言:javascript
复制
%.o: Components/Implementations/%.cpp
        gcc -c $< -o $@ -lwiringPi

$(OBJECTS): $(HEADERS)

这样做的好处是,如果找不到其中一个标头,您将得到更清晰的错误消息。当您使用模式规则时,make将尝试匹配它能够匹配的所有模式,如果没有匹配,它将告诉您它不知道如何构建目标。由于构建目标通常有许多不同的方法,所以make并不会对不匹配的每个目标都显示错误。

但是,如果您声明了两个文件之间的直接显式先决条件关系,而不是使用可能匹配或可能不匹配的模式,那么如果缺少一个文件make将直接告诉您。

ETA2

在原始makefile中,有这样一个规则:

代码语言:javascript
复制
RumPi: $(OBJECTS)
        gcc $(OBJECTS) -o $@ -lwiringPi

但后来你把它移走了。你为什么要把这个拿出来?您需要这个规则来告诉make如何链接您的可执行文件RumPi

另外,您不应该使用gcc作为C++代码的编译器/链接器;gcc用于C,而不是C++。您应该将g++用于C++代码。最好将这些信息包含在变量中,这样就很容易找到和修改(即使是在命令行中)。C++编译器的标准变量名是CXX等。

生成文件应该如下所示:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47244709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档