使用 WiringPi 的简单 Makefile
Simple Makefile using WiringPi
我是 Makefile 新手。我一直在为我的 RaspberyPi 相关项目使用 WiringPi 制作一个简单的 C++ 库。到目前为止,使用 LED class、DuelLED、电机、按钮等(.h 和 .cpp)之类的东西非常简单。我能够拼凑一个 Makefile 但我收到错误 "No rule to make target RumPi.o needed by RumPi". (注意:我的库的名称称为鲁皮)
感谢大家的帮助,这是最后的修复:
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
该消息意味着 make 无法确定如何构建该目标 (RumPi.o
)。你有 Components/Implementations/RumPi.cpp
文件吗?您在 $(HEADERS)
变量中列出的所有 header 文件是否实际存在?如果其中任何一个不正确,那么您的模式规则将不匹配。如果您的模式规则不匹配(并且默认规则不匹配),那么 make 无法弄清楚如何构建 object 文件。
如果您需要完整的详细信息,您可以 运行 make -d
并检查调试输出。你可能想将它重定向到一个文件,这样你就可以用 less
或文本编辑器查看它,因为有很多输出。
顺便说一下,你不应该在你的编译行中添加 -lwiringPi
选项。库仅在 link 时使用,不在编译时使用。
预计到达时间
您应该考虑的另一件事是重写您的模式规则,以便仅将源文件列为先决条件并将 header 移至单独的行:
%.o: Components/Implementations/%.cpp
gcc -c $< -o $@ -lwiringPi
$(OBJECTS): $(HEADERS)
这样做的好处是,如果未找到 header 之一,您将获得更清晰的错误消息。当您使用模式规则时,make 将尝试匹配 所有 它可以匹配的模式,如果 none 匹配它会告诉您它不知道如何构建目标。由于通常有许多不同的方法来构建目标,make 不会为每个不匹配的方法显示错误。
但是如果你直接声明两个文件之间的显式先决条件关系,而不是使用可能匹配也可能不匹配的模式,那么如果缺少文件,make 会告诉你直接。
ETA2
在你原来的 makefile 中你有这样的规则:
RumPi: $(OBJECTS)
gcc $(OBJECTS) -o $@ -lwiringPi
但后来你删除了它。你为什么把这个拿出来?你需要这个规则来告诉 make 如何 link 你的可执行文件 RumPi
.
此外,您不应该使用 gcc
作为 C++ 代码的 compiler/linker; gcc
适用于 C,而非 C++。对于 C++ 代码,您应该使用 g++
。最好将此信息包含在变量中,以便于查找和修改(如果您愿意,甚至可以从命令行)。 C++ 编译器的标准变量名是 CXX
等
您的 makefile 应如下所示:
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
我是 Makefile 新手。我一直在为我的 RaspberyPi 相关项目使用 WiringPi 制作一个简单的 C++ 库。到目前为止,使用 LED class、DuelLED、电机、按钮等(.h 和 .cpp)之类的东西非常简单。我能够拼凑一个 Makefile 但我收到错误 "No rule to make target RumPi.o needed by RumPi". (注意:我的库的名称称为鲁皮)
感谢大家的帮助,这是最后的修复:
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
该消息意味着 make 无法确定如何构建该目标 (RumPi.o
)。你有 Components/Implementations/RumPi.cpp
文件吗?您在 $(HEADERS)
变量中列出的所有 header 文件是否实际存在?如果其中任何一个不正确,那么您的模式规则将不匹配。如果您的模式规则不匹配(并且默认规则不匹配),那么 make 无法弄清楚如何构建 object 文件。
如果您需要完整的详细信息,您可以 运行 make -d
并检查调试输出。你可能想将它重定向到一个文件,这样你就可以用 less
或文本编辑器查看它,因为有很多输出。
顺便说一下,你不应该在你的编译行中添加 -lwiringPi
选项。库仅在 link 时使用,不在编译时使用。
预计到达时间
您应该考虑的另一件事是重写您的模式规则,以便仅将源文件列为先决条件并将 header 移至单独的行:
%.o: Components/Implementations/%.cpp
gcc -c $< -o $@ -lwiringPi
$(OBJECTS): $(HEADERS)
这样做的好处是,如果未找到 header 之一,您将获得更清晰的错误消息。当您使用模式规则时,make 将尝试匹配 所有 它可以匹配的模式,如果 none 匹配它会告诉您它不知道如何构建目标。由于通常有许多不同的方法来构建目标,make 不会为每个不匹配的方法显示错误。
但是如果你直接声明两个文件之间的显式先决条件关系,而不是使用可能匹配也可能不匹配的模式,那么如果缺少文件,make 会告诉你直接。
ETA2
在你原来的 makefile 中你有这样的规则:
RumPi: $(OBJECTS)
gcc $(OBJECTS) -o $@ -lwiringPi
但后来你删除了它。你为什么把这个拿出来?你需要这个规则来告诉 make 如何 link 你的可执行文件 RumPi
.
此外,您不应该使用 gcc
作为 C++ 代码的 compiler/linker; gcc
适用于 C,而非 C++。对于 C++ 代码,您应该使用 g++
。最好将此信息包含在变量中,以便于查找和修改(如果您愿意,甚至可以从命令行)。 C++ 编译器的标准变量名是 CXX
等
您的 makefile 应如下所示:
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