具有常见命令行选项的 Hello world

对于具有单个源文件的程序,使用 gcc 很简单。

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}

要从命令行编译文件 hello_world.c:

gcc hello_world.c

然后 gcc 将编译程序并将可执行文件输出到文件 a.out。如果要命名可执行文件,请使用 -o 选项。

gcc hello_world.c -o hello_world

然后,可执行文件将命名为 hello_world 而不是 a.out。默认情况下,gcc 发出的警告不多。gcc 有很多警告选项,最好查看 gcc 文档以了解可用的内容。使用’-Wall’是一个很好的起点,涵盖了许多常见问题。

gcc -Wall hello_world.c -o hello_world

输出:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^

在这里,我们看到我们现在得到一个警告,即变量’i’被声明但在函数中根本没有使用。

如果你打算使用调试器来测试程序,则需要告诉 gcc 包含调试信息。使用’-g’选项调试支持。

gcc -Wall -g hello_world.c -o hello_world

hello_world 现在具有 GDB 支持的调试信息。如果使用其他调试器,则可能需要使用不同的调试选项,以便正确格式化输出。有关更多调试选项,请参阅官方 gcc 文档。

默认情况下,gcc 编译代码以便于调试。gcc 可以优化输出,以便最终的可执行文件产生相同的结果但性能更快,并且可能导致更小的可执行文件。 ‘-O’选项可以进行优化。在 O 之后添加几个可识别的限定符以指定优化级别。每个优化级别都添加或删除一组命令行选项。 ‘-O2’,’ - os’,’ - O0’和’-Og’是最常见的优化级别。

gcc -Wall -O2 hello_world.c -o hello_world

‘-O2’是生产就绪代码的最常见优化级别。它在性能提升和最终可执行文件大小之间提供了出色的平衡

gcc -Wall -Os hello_world.c -o hello_world

‘-Os’类似于’-O2’,除了可以通过增加可执行文件大小来提高执行速度的某些优化被禁用。如果最终的可执行文件大小对你很重要,请尝试’-Os’并查看最终可执行文件中是否存在明显的大小差异。

gcc -Wall -g -Og hello_world.c -o -hello_world

请注意,在上面的’-Os’和’-O2’示例中,删除了’-g’选项。那是因为当你开始告诉编译器优化代码时,某些代码行本质上不再存在于最终的可执行文件中,这使得调试变得困难。但是,也存在仅在启用优化时才会发生某些错误的情况。如果要调试应用程序并让编译器优化代码,请尝试使用’-Og’选项。这告诉 gcc 执行所有不应妨碍调试体验的优化。

gcc -Wall -g -O0 hello_world.c -o hello_world

‘-O0’执行的优化比’-Og’更少。这是 gcc 默认使用的优化级别。如果要确保禁用优化,请使用此选项。