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

时间:2017-09-10 18:58:57

标签: c++ makefile

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

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

根据g ++手册,这会编译或汇编源文件,但不会链接它们。

  

&GT;   -C   编译或汇编源文件,但不要链接。链接阶段根本没有完成。最终输出是每个源文件的目标文件的形式。   默认情况下,源文件的目标文件名是通过替换后缀.c',。i',.s', etc., with。o'来创建的。   无法识别的输入文件,不需要编译或汇编,将被忽略。

换句话说,我只是想知道在c ++中进行编译时究竟“没有链接”是什么意思?

1 个答案:

答案 0 :(得分:5)

单个C或C ++程序的代码可以分成多个C或C ++文件。这些文件称为翻译单元

编译将每个翻译单元转换为表示属于单个翻译单元的二进制代码的特殊格式,以及将多个单元连接在一起的一些附加信息。

例如,可以在一个a.c文件中定义一个函数,并从b.c文件中调用它。格式将函数的二进制代码放入a.o,并记录函数代码的起始位置。文件b.c将对函数的所有引用记录到b.o

链接将b.o的引用连接到a.o的函数,生成程序的最终可执行文件。

将翻译过程分为两个阶段,即编译和链接,以提高翻译速度。当您从一组十几个文件中修改单个文件时,只需要编译一个文件,而剩余的.o文件可以从以前的翻译中重复使用。