为什么我需要一个 c 程序正好四个步骤
Why do I need for a c program exactly four steps
为什么我要创建一个可执行文件需要一个c程序刚好四步?预编译器、编译器、汇编器和链接器。如果它只是创建符号机器代码,我不明白为什么我需要编译器步骤。如果您在 gcc 中使用命令 gcc -c,它会一步完成编译和汇编(并生成 *.o 文件)。
gcc
实用程序有多种不同的使用方式。其中一些方法会将多个处理步骤合并为一个 command-line 操作。这并不意味着这些步骤不会发生,只是我们没有看到它们。
例如,我们可以使用gcc
将一堆源文件直接编译为二进制文件,将所有pre-processing、编译和link阶段组合到一个命令中。或者我们可以使用 gcc
以便所有这些步骤都是独立的,如果我们愿意的话。
例如,gcc -E
将只执行 pre-processing 步骤。 -c
开关允许 pre-processing 和编译,但在 linking 之前停止。如果我们只提供目标文件作为输入,默认情况下 gcc
将尝试 link 它们。
事实上,gcc
是一个非常复杂的软件,有无数的 command-line 开关来精确控制它的功能。某些(可能很多)步骤对用户隐藏的事实并不意味着它们不会发生。
顺便说一下,我要质疑最初的断言,即生成可执行文件需要“正好四个步骤”。这取决于您将操作视为一个独特的“步骤”的重要性。
从程序员的角度来看,这些大多是不必要的步骤,大多数工具链允许您使用一个命令调用编译器 + linker。
但是,编译 + 构建二进制文件通常需要更长的时间来执行,因此您通常不想构建,除非您确实打算 运行 该程序。通常在编码过程中,我们点击编译以查看我们没有犯任何愚蠢的错误,然后继续进行。因此我们希望编译尽可能快。
此外,在一切都由 command-line 驱动的日子里,您必须管理所有关于如何手动构建可执行文件的脏细节。 link、linker 选项、调试器选项、生成文件的文件。大多数工具链在现代 IDE.
的背后仍然像传统一样工作
一些工具链还允许您将 .c 文件 link 和目标文件、lib、dll 等,您可以将这些文件与 C 代码头一起提供给其他程序员,而不会暴露所有细节对他们的实施。
从编译器的角度来看,将编译器分为 C 语言编译器、该编译器的 system-specific 端口和生成可执行文件的 linker 是完美的设计意义。您不希望 re-write 整个编译器只是为了在 x86 和 PowerPC 之间移植它。所有 C-language 相关的东西都可以保持不变,你只是 re-write 生成汇编程序和二进制文件的部分。
为什么我要创建一个可执行文件需要一个c程序刚好四步?预编译器、编译器、汇编器和链接器。如果它只是创建符号机器代码,我不明白为什么我需要编译器步骤。如果您在 gcc 中使用命令 gcc -c,它会一步完成编译和汇编(并生成 *.o 文件)。
gcc
实用程序有多种不同的使用方式。其中一些方法会将多个处理步骤合并为一个 command-line 操作。这并不意味着这些步骤不会发生,只是我们没有看到它们。
例如,我们可以使用gcc
将一堆源文件直接编译为二进制文件,将所有pre-processing、编译和link阶段组合到一个命令中。或者我们可以使用 gcc
以便所有这些步骤都是独立的,如果我们愿意的话。
例如,gcc -E
将只执行 pre-processing 步骤。 -c
开关允许 pre-processing 和编译,但在 linking 之前停止。如果我们只提供目标文件作为输入,默认情况下 gcc
将尝试 link 它们。
事实上,gcc
是一个非常复杂的软件,有无数的 command-line 开关来精确控制它的功能。某些(可能很多)步骤对用户隐藏的事实并不意味着它们不会发生。
顺便说一下,我要质疑最初的断言,即生成可执行文件需要“正好四个步骤”。这取决于您将操作视为一个独特的“步骤”的重要性。
从程序员的角度来看,这些大多是不必要的步骤,大多数工具链允许您使用一个命令调用编译器 + linker。
但是,编译 + 构建二进制文件通常需要更长的时间来执行,因此您通常不想构建,除非您确实打算 运行 该程序。通常在编码过程中,我们点击编译以查看我们没有犯任何愚蠢的错误,然后继续进行。因此我们希望编译尽可能快。
此外,在一切都由 command-line 驱动的日子里,您必须管理所有关于如何手动构建可执行文件的脏细节。 link、linker 选项、调试器选项、生成文件的文件。大多数工具链在现代 IDE.
的背后仍然像传统一样工作一些工具链还允许您将 .c 文件 link 和目标文件、lib、dll 等,您可以将这些文件与 C 代码头一起提供给其他程序员,而不会暴露所有细节对他们的实施。
从编译器的角度来看,将编译器分为 C 语言编译器、该编译器的 system-specific 端口和生成可执行文件的 linker 是完美的设计意义。您不希望 re-write 整个编译器只是为了在 x86 和 PowerPC 之间移植它。所有 C-language 相关的东西都可以保持不变,你只是 re-write 生成汇编程序和二进制文件的部分。