构建或编译

时间:2013-03-04 09:54:31

标签: c++ build compilation

我有一个关于编译和构建之间差异的理论问题。我正在编写一个需要花费大量时间来构建的c ++项目,所以我已经告诉要在“我修改了任何头文件”的情况下进行构建。真的吗?如果我在headder文件中添加一个新属性,那么我必须构建吗?编译不够吗?

谢谢!

6 个答案:

答案 0 :(得分:18)

“建筑”是一个含糊的术语,通常指整个过程,预处理,编译和链接。在源更改之后,必须重做这些过程的哪些部分取决于已更改的内容。如果您只更改了一个.cpp源,则只需重新编译它并再次链接对象即可。如果您更改.h标头,则必须重新编译包含此标头的所有源文件,这通常很昂贵,因为特定于项目的标头往往包含在许多源文件中。

简而言之,如果您对源进行了更改,则必须重新编译受此影响的所有文件,并且必须重新链接整个二进制文件。

答案 1 :(得分:10)

  

编译是将源代码转换为目标代码的行为。

     

链接是将目标代码与库组合成原始可执行文件的行为。

     

构建是由编译和链接组成的序列,可能还有其他任务,例如安装程序创建。

取自What is the difference between compile code and executable code?

因此,您只需(重新)编译比源文件更旧的对象代码(“最近编辑过”),以链接包含程序中最新更改的可执行文件。实际上,这就是make决定是否构建文件的方式。

答案 2 :(得分:6)

编译是将高级代码转换为机器级代码的过程

构建是将高级语言转换为可执行文件的过程。它将涉及编译和链接。

如果修改了头文件,头文件可能会影响几个c ++文件,因此需要构建最终的可执行文件

单独编译是没有用的,因为它不会产生最终的可删除性,因此你需要始终构建。

答案 3 :(得分:2)

Build是将源代码转换为可执行文件的完整过程,因为C ++编译是将源代码转换为目标代码。在构建中,将编译C ++代码,然后您将需要其他阶段,包括构建可执行文件的链接阶段。构建还可以涉及其他步骤,例如在编译之前预处理或生成源代码文件。

仅在“我修改了任何头文件”的情况下进行构建只意味着只编译包含(直接或通过其他包含文件)的文件,然后链接所有对象。 Ina“完整”构建所有文件都将被编译,因此这将减少要编译的文件数量并减少总体构建时间。

如果您更改了头文件,那么您必须构建,编译只会创建一个尚未成为可执行文件一部分的新目标文件。

答案 4 :(得分:1)

编译只是构建中的一个步骤。无论何时需要重新编译,都需要重建。

编译只获取源文件及其包含的头文件,并为每个源文件生成一个目标文件。 Building还将这些文件链接在一起以创建可执行文件。因此,如果您更改源文件,则需要构建,如果您想要测试新的可执行文件。编译只会让你分道扬..

答案 5 :(得分:1)

我不确定我完全理解你的问题。

编译只是构建过程的一部分(包括预处理,编译,链接以及可能的其他过程)。它创建目标文件,然后链接器链接到可执行文件,因此仅编译是不够的。

如果您的问题确实是否应该运行完整版本的软件,那么有时您不必更改实现(.cpp)文件,但是如果您还更改了声明(即标题)那么你很可能需要这样做。在任何情况下,您都必须完全构建受影响的组件 - 而不仅仅是编译它。