第一个 Makefile 问题:没有制定目标的规则

First Makefile Questions: No rule to make target

我正在尝试创建我的第一个 Makefile 并寻找最简单、最容易理解的版本——即使它不是“好的做法”。我稍后再处理。 :)

基本上,我只想在命令行中 运行 make 并让它执行几个 g++ 命令,所以我不必这样做。例如,而不是在命令行中输入以下(在顶级目录)...

$g++ -c ./src/RaspPi4Main.cpp -o ./src/RaspPi4Main.o

$g++ -c ./src/funcI2cCom/funcI2cCom.cpp -o ./src/funcI2cCom/funcI2cCom.o

$g++ -o ./bin/RaspPi4Main ./src/RaspPi4Main.o ./src/funcI2cCom/funcI2cCom.o -lwiringPi

...我想要类似于我对 Makefile 的尝试:

RaspPi4Main: RaspPi4Main.o funcI2cCom.o (and all header files? or not needed if added below?)
    g++ -o ./bin/RaspPi4Main ./src/RaspPi4Main.o  ./src/funcI2cCom/funcI2cCom.o -lwiringPi

RaspPi4Main.o: RaspPi4Main.cpp
    g++ -c ./src/RaspPi4Main.cpp -o ./src/RaspPi4Main.o

funcI2cCom.o: funcI2cCom.cpp funcI2cCom.h
    g++ -c ./src/funcI2cCom/funcI2cCom.cpp -o ./src/funcI2cCom/funcI2cCom.o

希望我很接近?谢谢!

作为第一步,您需要确保您的配方生成它们的目标并且输入是文件或其他规则的目标:

bin/RaspPi4Main: src/RaspPi4Main.o src/funcI2cCom/funcI2cCom.o 
    g++ -o bin/RaspPi4Main src/RaspPi4Main.o src/funcI2cCom/funcI2cCom.o -lwiringPi

src/RaspPi4Main.o: src/RaspPi4Main.cpp
    g++ -c src/RaspPi4Main.cpp -o src/RaspPi4Main.o

src/funcI2cCom/funcI2cCom.o: src/funcI2cCom/funcI2cCom.cpp src/funcI2cCom/funcI2cCom.h
    g++ -c src/funcI2cCom/funcI2cCom.cpp -o src/funcI2cCom/funcI2cCom.o

请注意,这非常冗长。您可以使用 automatic variables 大大缩短它。具体来说,$@是target的名字,$<是第一个依赖的名字,$^是所有的依赖:

bin/RaspPi4Main: src/RaspPi4Main.o src/funcI2cCom/funcI2cCom.o 
    g++ -o $@ $^ -lwiringPi

src/RaspPi4Main.o: src/RaspPi4Main.cpp
    g++ -c $< -o $@

src/funcI2cCom/funcI2cCom.o: src/funcI2cCom/funcI2cCom.cpp src/funcI2cCom/funcI2cCom.h
    g++ -c $< -o $@

请注意,其中有相当多的重复。幸运的是,Make 已经知道如何通过 implicit rules 将 .cpp 文件编译成 .o 文件。因此,您可以省略这些规则的食谱:

bin/RaspPi4Main: src/RaspPi4Main.o src/funcI2cCom/funcI2cCom.o 
    g++ -o $@ $^ -lwiringPi

src/RaspPi4Main.o: src/RaspPi4Main.cpp
src/funcI2cCom/funcI2cCom.o: src/funcI2cCom/funcI2cCom.cpp src/funcI2cCom/funcI2cCom.h