“编译和链接”与仅“编译”(使用g++)有什么区别?

6

我是c++的新手,一直在学习如何创建makefile,并注意到我的一个例子(与“更新”更改文件和忽略未更改文件有关)具有以下命令:

# sysCompiler is set to g++
.o:.cpp 
    $(sysCompiler) -c $<

根据g++手册,该命令编译或汇编源文件,但不进行链接操作。
-c选项的作用是编译或汇编源文件,而不进行链接。因此最终的输出结果是每个源文件生成一个目标文件。默认情况下,源文件生成的目标文件名称为将后缀名.c、.i、.s等替换为.o。未被识别为需要编译或汇编的输入文件将被忽略。
换言之,当涉及到C++编译时,'not linking'意味着仅编译或汇编源文件,而未进行链接操作。

https://dev59.com/9W025IYBdhLWcg3wAxB9 - WhozCraig
1个回答

10
单个C或C++程序的代码可以分为多个C或C++文件。这些文件称为“翻译单元”。
编译将每个翻译单元转换为一种特殊格式,该格式表示属���单个翻译单元的二进制代码,以及连接多个单元的一些附加信息。
例如,可以在一个a.c文件中定义一个函数,并从b.c文件中调用它。该格式将函数的二进制代码放置到a.o中,并记录函数代码开始位置,文件b.c将所有对该函数的引用记录到b.o中。
链接将来自b.o的引用连接到a.o中的函数,生成程序的最终可执行文件。
将翻译过程分为两个阶段——编译和链接,是为了提高翻译速度。当您修改文件集中的单个文件时,只需要编译那个文件,而剩余的.o文件可以从先前的翻译中重复使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接