相反
具有单个default
目标,做一切每个单独的输出应该是一个make目标的。这允许make正常工作,一次构建一件事,按照正确的顺序(或者如果依赖关系图允许的话,并行地)并且在每个步骤正确地报告错误。另外,非常重要的是,通过讲述关于每个单独目标以及它们依赖于的内容,确保当依赖性发生变化时,由于依赖性发生变化,make会准确知道需要重新构建哪些目标。这是Make的最佳功能。
在你的情况下,最终的目标是main
所以你想要的default
目标说main
构建,你要做的就是main
的先决条件:
default: main
现在你需要说如何建立main
,这取决于不同的目标文件,所以我们告诉作出这样的:
main: main.o sample.o sample_2.o sample_3.o
这表示这取决于这些目标文件(它们是其prerequsites),所以他们会b首先建成。这些对象中的每一个都是另一个将单独构建的制作目标。
当所有先决条件已建成配方将被用于将它们连接到main
,所以我们需要一个配方添加到上述目标:
main: main.o sample.o sample_2.o sample_3.o
g++ main.o sample.o sample_2.o sample_3.o -o main
制作有很多的缩写来简化事情,例如$(CXX)
是C++编译器,[email protected]
意味着当前目标和$^
意味着当前目标的先决条件,这样你就可以简化规则:
main: main.o sample.o sample_2.o sample_3.o
$(CXX) $^ -o [email protected]
这实际上是你所需要的,让已经知道如何使用来构建.o
先决条件它的内置规则,所以它会看到一个名为main.cpp
的文件,并且知道它可以编译创建main.o
,并参见sample.cpp
并将其编译为sample.o
等。它将从makefile创建一个依赖关系图来决定需要哪些目标以便建立default
(这意味着它决定需要main
,需要main.o
,sample.o
等,他们需要main.cpp
和sample.cpp
等,这些已经存在,所以它可以开始建设的先决条件,直到它必须然后链接main
所需要的一切就可以做到这一点,光洁度。)
现在,如果你改变sample_2.cpp
和再次运行make
会看到sample_2.o
已过期,需要重新编译,但其他.o
文件还行(它们是新的,然后它们所依赖的.cpp
文件),因此它会重新编译sample_2.o
和重新链接main
而不是重建一切。
事实上,你甚至可以进一步简化它,使用默认的配方链接对象成可执行:
LINK.o = $(CXX)
default: main
main: main.o sample.o sample_2.o sample_3.o
这就是你所需要的!但是,对于初学者来说,通常会更清晰地使用更详细的版本,因为当您不熟悉Make的所有自动规则和变量时,定制更容易。
告诉make有关头文件的依赖关系也很有帮助,这样当头文件发生变化时,事情就会重建。这可以使用编译器自动完成,以生成先决条件,但对于简单的情况,您可以直接将其添加到makefile中,例如,
sample.o: sample.hpp sample.cpp
阅读gcc手册和make手册。至少,学习如何在没有make的情况下实现你想要的shell。 –
如果您的'make'甚至不执行,请重新安装它。 – EJP