我正在查看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中?我完全迷失在clean
和linkerError
试图做的事情上。有人可以帮我理解发生了什么吗?
答案 0 :(得分:2)
这个流程图比它解释的更困惑,因为它似乎不必要地复杂化。实际上,每一步都是相当简单的,将它们全部插入一个图表是没有意义的。
记住Makefile
只是建立一个依赖链,它试图遵循的操作顺序,左边的文件依赖于右边的文件。
以下是function.o
是 function.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++
会在指示时默默地为您执行此操作,就像这里一样。
我认为有更好的例子比你在这里工作更好。这个文件充满了混乱。