了解makefile

时间:2017-07-20 04:55:29

标签: c++ makefile g++

我正在查看this流程图,以了解makefile是如何运作的,但我仍然在努力100%理解正在发生的事情。

我有一个main.cpp文件,它调用了function.h和function.cpp中定义的一些函数。然后,我给出了makefile:

main: main.cpp function.o
    g++ main.cpp function.o -o main

mainAssembly: main.cpp
    g++ -S main.cpp

function.o: function.cpp
    g++ -c function.cpp

clean:
    rm -f *.o *.S main

linkerError: main.cpp function.o
    g++ main.cpp function.o -o main

发生了什么?据我所知,到目前为止我们正在编译function.cpp,它会变成一个目标文件?为什么这有必要?

我不知道mainAssembly部分到底在做什么。我试过阅读g ++标志,但我仍然无法理解这是什么。这只是用头文件编译main.cpp吗?难道我们也不能将main转换为目标文件吗?

我猜main只是简单地将所有内容链接到一个名为main的exe中?我完全迷失在cleanlinkerError试图做的事情上。有人可以帮我理解发生了什么吗?

1 个答案:

答案 0 :(得分:2)

这个流程图比它解释的更困惑,因为它似乎不必要地复杂化。实际上,每一步都是相当简单的,将它们全部插入一个图表是没有意义的。

记住Makefile只是建立一个依赖链,它试图遵循的操作顺序,左边的文件依赖于右边的文件。

以下是function.ofunction.cpp产品的第一部分:

function.o: function.cpp
    g++ -c function.cpp

如果function.cpp发生更改,则必须重建.o文件。如果function.h存在,这可能不完整,因为function.cpp可能#include,所以正确的定义可能是:

function.o: function.cpp function.h
    g++ -c function.cpp

现在,如果您想知道为什么要在单个.cpp文件中构建单个.o,请考虑更大规模的程序。每次更改任何内容时,您都不希望重新编译每个源文件,您只想编译直接受更改影响的内容。修改function.cpp只应影响function.o,而不影响main.o,因为它不相关。但是,由于function.h中的引用,更改main.o可能会影响main.cpp。这取决于#include引用内容的方式。

这部分有点奇怪:

mainAssembly: main.cpp
    g++ -S main.cpp

那只是转储main.cpp的编译汇编代码。这是一个可选步骤,不是构建最终可执行文件所必需的。

这部分将这两部分组合在一起:

main: main.cpp function.o
    g++ main.cpp function.o -o main

我之所以这样说是因为通常您将所有.cpp个文件编译为.o,然后将.o个文件与您的libstdc++链接在一起库和您使用ld工具(如链接器)所使用的任何其他共享库。任何典型编译的最后一步是链接以生成二进制可执行文件或库,但是g++会在指示时默默地为您执行此操作,就像这里一样。

我认为有更好的例子比你在这里工作更好。这个文件充满了混乱。