Linux 中重要的 GCC 标志
您可以使用 GCC 标志来扩展 GCC 编译器的功能。以下是一些常见但重要的标志。
如果您使用 Linux 使用 C 或 C++ 进行编程,则编译过程将由 GCC(又名 GNU 项目 C 和 C++ 编译器)处理。
与往常一样,您可以使用标志来扩展功能。
让我们看看一些最重要的 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
例如,这里我将可执行文件命名为Result
:
gcc main.c -o Result
2. 使用 -Wall 启用每个警告
如果您想打印每个警告,以便可以检查代码并使其比以往更好,请使用 -Wall
标志。
gcc -Wall main.c -o Result
例如,在这里,我将使用不初始化变量的代码:
#include<stdio.h>
int main(void)
{
int i;
printf("\n Linuxhandbook [%d]\n", i);
return 0;
}
当我执行代码时,它给了我一个警告,说‘i’未初始化使用
:
3. 使用 -l 链接到共享库
要将 C 程序与共享库链接,您所要做的就是在共享库的名称后面附加 -l
标志
例如,在这里我将代码 main.c 与共享库 pthread
链接起来以生成最终的可执行文件 Result
:
gcc main.c -o Hello -lpthread
但是如果你想链接外部库怎么办?在这种情况下,您必须使用 -L
指定外部库的位置。
例如,在这里,我链接了存储在 /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.s
的 main.c
的汇编输出:
gcc -S main.c > main.s
6. 仅使用 -C 生成编译代码
要获得没有任何链接的编译代码,您所要做的就是使用 -C
标志。
例如,在这里,我在名为 compiled
的文件中生成了 main.c
的编译代码:
gcc -C main.c -o compiled
7.使用-save-temps生成所有中间文件
之前,我解释了如何获得预处理、汇编和编译的输出,但是如果我告诉您可以一次获得所有这些输出呢?
它非常简单,可以使用 -save-temps
标志轻松生成。
假设我想生成 main.c
文件的所有中间文件,因此我需要遵循给定的命令:
gcc -save-temps main.c
8. 使用 -Werror 将警告转换为错误
在测试时,我们程序员往往会忽略可能表明应用程序中存在漏洞和安全威胁的警告。
为了使您的代码坚如磐石,我建议您使用 -Werror
标志将警告转换为错误。
在这里,我使用的代码会给你一个警告:“未定义的变量 c”:
#include<stdio.h>
int main(void)
{
char c;
// Print the string
printf("\n Linuxhandbook [%d]\n", c);
return 0;
}
但是当我在执行时使用 -Werror
标志时,它没有发出警告,而是给出了一个错误:
9. 使用 -fPIC 获取与位置无关的代码
这个标志对于那些处理动态链接的人来说是至关重要的,尤其是共享库。
创建共享库时,您应该具有与位置无关的代码,以便可以从任何地址而不是静态地址加载共享库。
例如,在这里,我从 main.c
创建了一个名为 libmain.so
的共享库:
gcc -c -Wall -Werror -fPIC main.c
gcc -shared -o libmain.so main.o
10. 使用 -V 获取编译的详细输出
如果您想逐行了解 GCC 对代码执行的操作,可以使用 -V
标志来获得详细输出。
gcc -Wall -v main.c -o Result
奖励:使用该文件应用 GCC 标志
如果您使用同一组标志来编译程序,那么拥有一个包含必要选项的文件可以节省大量时间。
首先,让我们使用 touch 命令创建一个文件:
touch Flags
现在,您可以使用任何您喜欢的文本编辑器来输入标志。只需确保用空格分隔它们。
我在文件中保存了 3 个标志:
添加完标志后,您所要做的就是在文本文件中附加 @
符号:
gcc main.c @Flags
正如您所看到的,它将警告转换为错误并创建了所有中间文件。
包起来
在本教程中,我介绍了一些可用于日常编译的最重要的 GCC 标志。
我强烈推荐我最后提到的额外提示,因为它节省了大量时间并且使用起来非常方便。
如果您有任何疑问或建议,请在评论中告诉我。