16

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

谢谢!

4

6 回答 6

23

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

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

于 2013-03-04T10:02:05.847 回答
17

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

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

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

摘自编译代码和可执行代码有什么区别?

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

于 2013-03-04T10:05:50.480 回答
8

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

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

在修改头文件的情况下,头文件可能会影响多个 c++ 文件,因此要获得最终的可执行文件,您需要构建它

单独编译没有用,因为它不会产生最终的可执行文件,因此您需要始终构建。

于 2013-03-04T10:02:59.837 回答
3

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

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

如果您更改头文件,那么您必须构建,编译只会创建一个新的目标文件,它还不是可执行文件的一部分。

于 2013-03-04T10:02:37.813 回答
1

编译只是构建的步骤之一。任何时候需要重新编译,都需要重新编译。

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

于 2013-03-04T10:03:15.873 回答
1

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

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

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

于 2013-03-04T10:05:01.413 回答