Linux 中重要的 GCC 标志

如果您使用 Linux 使用 C 或 C++ 进行编程,则编译过程将由 GCC 处理,也就是 GNU 项目 C 和 C++ 编译器。

和往常一样,您可以使用标志来扩展功能。

那么让我们看看一些最重要的 GCC 标志。

重要的 GCC 标志

为了便于理解,我将使用以下 C 程序:

#include<stdio.h>

int main(void)
{
   printf("n Linuxhandbook n");
   return 0;
}

很简单,对吧? 不要评判我的编程技能。

1.使用-o指定输出文件名

在最基本的术语中,您将按如下方式使用 GCC 编译器:

gcc main.c

上面的命令将编译程序并创建一个名为 a.out.:

要指定输出可执行文件名,您需要做的就是在文件名后附加 -o 标志如下图:

gcc main.c -o Filename

为了 example,在这里,我命名了可执行文件 Result:

gcc main.c -o Result

2. 使用 -Wall 启用每个警告

如果您想打印每个警告以便检查您的代码并使它比以前更好,请使用 -Wall 旗帜。

gcc -Wall main.c -o Result

为了 example,在这里,我将使用不初始化变量的代码:

#include<stdio.h>

int main(void)
{
   int i;
   printf("n Linuxhandbook [%d]n", i);
   return 0;
}

当我执行代码时,它给了我一个警告说 ‘i’ is used uninitialized:

在 GCC 编译器中启用警告

要将 C 程序与共享库链接,您所要做的就是将共享库的名称附加到 -l 旗帜

为了 example,这里我将代码 main.c 与共享库链接起来 pthread 生成最终的可执行文件 Result:

gcc main.c -o Hello -lpthread

但是如果你想链接外部库怎么办? 在这种情况下,您必须使用 -L.

为了 example,在这里,我链接了存储在 /home/user/LHB 中的共享库“LHB”:

gcc -L/home/user/LHB -o main.c Results -lLHB

4.仅使用-E获取预处理器输出

预处理是编译的第一阶段,如果你只关心第一阶段代码发生了什么,你可以使用 -E 旗帜。

在这里,我将标准输出重定向到 first-stage.i 文件:

gcc -E main.c > first-stage.i

5.使用-S获取汇编代码

如果您关心编译期间的汇编输出,可以使用 -S 旗帜。

在这里,我生成了 main.c 命名为 main.s:

gcc -S main.c > main.s

6. 仅使用-C 生成编译后的代码

要在没有任何链接的情况下获得编译代码,您所要做的就是使用 -C 旗帜。

为了 example,在这里,我生成了编译后的代码 main.c 在名为的文件中 compiled:

gcc -C main.c -o compiled

7. 使用 -save-temps 生成所有中间文件

之前,我解释了如何获得预处理、汇编和编译的输出,但是如果我告诉您可以一次获得所有这些结果呢?

这很容易,可以很容易地使用 -save-temps 旗帜。

假设我想为 main.c 文件所以我将被要求遵循给定的命令:

gcc -save-temps main.c
在 GCC 编译器中生成所有中间文件

8. 使用 -Werror 将警告转换为错误

在测试时,我们程序员往往会忽略可能表明应用程序中存在漏洞和安全威胁的警告。

为了使您的代码坚如磐石,我建议您使用以下方法将警告转换为错误 -Werror 旗帜。

在这里,我使用的代码会给你一个警告,说“未定义的变量 c”:

#include<stdio.h>

int main(void)
{
  char c;
  // Print the string
   printf("n Linuxhandbook [%d]n", c);
   return 0;
}

但是当我使用 -Werror 执行时标记,而不是警告,它给了我一个错误:

在 GCC 编译器中将警告转换为错误

9. 使用 -fPIC 获取与位置无关的代码

对于那些处理动态链接的人来说,这个标志可能是至关重要的,尤其是共享库。

在创建共享库时,您应该拥有与位置无关的代码,以便您可以从任何地址而不是静态地址加载共享库。

为了 example,在这里,我创建了一个名为 libmain.so 来自 main.c:

gcc -c -Wall -Werror -fPIC main.c
gcc -shared -o libmain.so main.o
在 GCC 编译器中获取与位置无关的代码

10. 使用 -V 获取详细的编译输出

如果你想逐行了解 GCC 对你的代码做了什么,你可以使用 -V 标志有详细的输出。

gcc -Wall -v main.c -o Result
获取 GCC 编译的详细输出

奖励:使用文件应用 GCC 标志

如果您使用同一组标志来编译程序,拥有一个包含必要选项的文件可以为您节省大量时间。

首先,让我们使用 touch 命令创建一个文件:

touch Flags

现在,您可以使用任何您喜欢的文本编辑器来输入标志。 只是 确保用空格分隔它们.

我在文件中保存了 3 个标志:

创建文件以在 GCC 中应用标志

完成添加标志后,您所要做的就是在文本文件中附加 @ 象征:

gcc main.c @Flags
在 Linux 中使用文件应用 GCC 标志

如您所见,它将警告转换为错误并创建了所有中间文件。

包起来

在本教程中,我介绍了一些可用于日常编译的最重要的 GCC 标志。

我强烈推荐我最后提到的奖金提示,因为它节省了很多时间并且使用起来非常方便。

如果您有任何疑问或建议,请在评论中告诉我。