2013-03-04 92 views
6

我对编译和构建的区别有一个理论问题。我正在编写一个需要花费大量时间构建的C++项目,所以我告诉我只是在“我修改了任何头文件”的情况下进行构建。真的吗?如果我在headder文件中添加一个新属性,那么我是否必须构建?编译不够?构建或编译

谢谢!

+0

你必须建立它。但IDE或制作工具只会构建需要构建的obj,lib和exe。 – neohope 2013-03-04 09:58:32

+0

编译和构建是一样的。基本上你重新编译源代码文件并链接它们生成的目标文件来构建新的可执行文件或lib。当你改变一些头文件时,包含这个头文件的源文件必须重新编译和链接以形成新的构建文件(可执行文件或lib文件),这将反映你在头文件中所做的更改。这种依赖关系的规则必须在项目的makefile中。 – 2013-03-04 10:03:43

回答

14

“建筑”是一个模糊的术语,通常意味着整个过程,预处理,编译和链接。源更改后必须重做这些进程的哪些部分取决于发生了什么变化。如果您只更改了一个源,则重新编译它并重新链接对象就足够了。如果更改.h标头,则全部包含此标头的源文件必须重新编译,这通常很昂贵,因为项目特定的标头往往会包含在许多源文件中。

总之,如果你已经做了更改消息来源称,受此影响的所有文件必须重新编译和整个二进制必须被重新链接。

1

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

只是在“我修改了任何头文件”的情况下,做一个构建仅仅意味着只有包括(直接或通过其他包含的文件)文件进行编译,然后将所有对象链接。 Ina“全部”构建所有文件将被编译,这样可以减少要编译的文件数量并缩短总体构建时间。

如果更改一个头文件,那么你必须建立,编制将只需要创建一个新的对象文件还不是可执行文件的一部分。

5

编译为高电平代码转换为机器代码级

大厦是高级语言转换成可执行的进程的进程。这将涉及编译和链接。

在头文件进行修改的情况下,头文件可能会影响到几个C++文件,从而让你需要构建它最终的可执行

有单独编译,因为它不会产生没有用最终可改变,因此你需要始终构建。

+2

我不同意最后一个 - **编译单独有一个使用** - 有时你需要编译来检查代码是否有效编译 - 你不需要编译,因为你的应用程序还没有准备好.. 或该部分只是不打算直接为EXE输出... – 2015-02-18 16:55:06

0

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

编译只是需要的源文件和其包含的头文件,并且生成用于每个源文件的目标文件。 Building还将这些文件链接在一起以创建可执行文件。所以如果你改变一个源文件,你需要编译,如果你想要一个新的可执行文件来测试。编译只会让你分开。

0

我不知道我完全理解你的问题。编译只是构建过程的一部分(包括预处理,编译,链接以及可能的其他部分)。它创建链接器然后链接到可执行文件的目标文件,所以只有编译是不够的。如果你的问题是真的是否应该运行你的软件的完整版本,那么有时你不必如果你只改变了实现(.cpp)文件,但如果你也改变了声明(即头文件)那么你很可能需要这样做。无论如何,你将不得不完全构建受影响的组件 - 而不仅仅是编译它。

6

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

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

Building是由编译和链接组成的序列,可能还有其他任务,如安装程序创建。从What is the difference between compile code and executable code?

采取

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