构建或编译
Build or compile
我有一个关于编译和构建之间区别的理论问题。我在一个c++项目中编程,需要花很多时间来构建,所以我告诉只在"我修改了任何头文件"的情况下进行构建。这是真的吗?如果我在头文件中添加新属性,那么我必须构建吗?是不是编译不够?
谢谢!
"构建"是一个模糊的术语,通常指整个过程,预处理,编译和链接。在源更改之后,这些流程的哪些部分必须重做取决于更改了什么。如果您只更改了单个.cpp
源,那么重新编译它并再次链接对象就足够了。如果您更改.h
头文件,所有包含此头文件的源文件都必须重新编译,这通常是昂贵的,因为特定于项目的头文件往往包含在许多源文件中。
简而言之,如果您对源代码进行了更改,那么受此影响的所有文件都必须重新编译,并且必须重新链接整个二进制文件。
编译是将源代码转换为目标代码的行为。
链接是将目标代码与库组合成原始可执行文件的行为。
构建是由编译和链接组成的序列,可能还有其他任务,如创建安装程序。
取自编译代码和可执行代码的区别是什么?
因此,您只需要(重新)编译比源文件更旧的("最近编辑的")目标代码来链接包含程序中最新更改的可执行文件。事实上,这就是make
如何决定是否建立一个文件。
编译是将高级代码转换为机器代码的过程
构建是将高级语言转换为可执行文件的过程。这将涉及编译和链接。
在修改头文件的情况下,头文件可能会影响几个c++文件,因此要获得最终的可执行文件,您需要构建它
单独编译是没有用的,因为它不会产生最终的可执行文件,因此您需要始终构建
Build是将源代码转换为可执行文件的完整过程,对于c++编译是将源代码转换为目标代码。在构建中,c++代码将被编译,然后您将需要其他阶段,包括链接阶段来构建可执行文件。构建还可以涉及其他步骤,例如,在编译之前预处理或生成源代码文件。
在"我修改了任何头文件"的情况下进行构建只是意味着只有包含(直接或通过其他包含的文件)的文件被编译,然后所有对象都被链接。在"完整"构建中,所有文件都将被编译,因此这将减少要编译的文件数量并减少总体构建时间。
如果你改变了头文件,那么你必须编译,编译只会创建一个新的目标文件,它还不是可执行文件的一部分。
编译只是构建过程中的一个步骤。任何时候需要重新编译,都需要重新编译。
编译只获取源文件及其包含的头文件,并为每个源文件生成一个目标文件。构建还将这些文件链接在一起以创建可执行文件。因此,如果您更改了源文件,如果您想要测试一个新的可执行文件,则需要构建。编译只会让你完成一部分。
我不太明白你的问题。
编译只是构建过程的一部分(构建过程包括预处理、编译、链接以及可能的其他过程)。它创建目标文件,然后链接器将其链接到可执行文件中,因此仅编译是不够的。
如果你的问题真的是你是否应该运行你的软件的完整构建,那么有时你不需要如果你只改变了实现(.cpp)文件,但如果你也改变了声明(即头文件),那么你很可能需要这样做。在任何情况下,您都必须完全构建受影响的组件——而不仅仅是编译它。
- Mingw-64 在构建和安装后不会编译 openCV 代码
- 使用 GN 构建预编译标头
- Visual Studio 2019编译和构建
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?
- 如何使用 CMake 在 android 构建上编译和共享两个 c++ 库
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 坚持编译QDoc以在Windows上构建qt5
- MSYS2 MinGW64 在 Windows 上构建 GMP/MPFR 作为静态库,并将它们链接到使用 CL 编译的
- 如何构建模板的显式实例化以提高编译速度?
- 为什么Qt必须从源代码构建以进行交叉编译?
- 在Yocto上本地构建和编译C / C++程序
- 在编译时构建交换机
- 使用 CMake (make) 和 GCC 构建和编译 gSOAP 项目
- Qt 模块(QtSerialPort)在Qt定制构建中找不到(针对ARM交叉编译)
- 如何在 C++11 编译时构建具有递增值的整数成员的结构序列
- 在构建时从源代码编译 OpenCV 3
- 当我分离编译和链接时,代码不构建
- 某些C++标头在放入 Xcode 前缀/预编译标头时会中断构建
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 无法在 ArchLinux 上使用 Qt 5.2 进行编译/构建