zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux 下进行 C 或 C++ 编程时重要的 GCC 标志

2023-02-25 17:59:03 时间

如果您在 Linux 下进行 C 或 C++ 编程,则必然要采用 GNU GCC 来编译 C 或 C++ 源代码生成可执行程序。

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

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

重要的 GCC 标志

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

#include<stdio.h>

int main(void)
{
printf("\n linuxmi.com \n");
return 0;
}

很简单,对吧?不要以此议论我的编程技能哦。

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

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

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc main.c

上面的命令将编译程序并创建一个名称为的可执行文件a.out.:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
tree
.
├── a.out
└── main.c

0 directories, 2 files

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

gcc main.c -o Filename

例如,在这里,我将可执行文件命名为linuxmi:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc main.c -o linuxmi

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
tree
.
├── a.out
├── linuxmi
└── main.c

0 directories, 3 files

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

如果您想打印每个警告以便您可以检查您的代码并使它比以往更好,请使用该-Wall标志。

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -Wall main.c -o linuxmi

例如,在这里,我将使用不初始化变量的代码:

#include<stdio.h>

int main(void)
{
int i;
printf("\n linuxmi.com [%d]\n", i);
return 0;
}

当我执行代码时,它给了我一条警告‘i’ is used uninitialized:如下图

3.使用 -l 链接共享库

要将 C 程序与共享库链接,您所要做的就是在共享库的名称后附加-l标志。

例如,在这里我将代码 main.c 与共享库链接起来pthread​以生成最终的可执行文件linuxmi:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc main.c -o Hello -lpthread

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

例如,在这里,我链接了存储在 /home/linuxmi/LHB 中的共享库“LHB”:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -L/home/linuxmi/LHB -o main.c linuxmi -lLHB

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

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

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

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -E main.c > first-stage.i

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

如果您关心编译期间的程序集输出,可以使用-S标志轻松生成。

在这里,我生成了main.c​名为 as的程序集输出main.s:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -C main.c -o compiled

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

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

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

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
⚡ gcc -C main.c -o compiled

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

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

它非常简单,可以使用-save-temps标志轻松生成。

假设我想为 main.c文 件生成所有中间文件,所以我需要遵循给定的命令:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -save-temps main.c

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

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

为了使您的代码坚如磐石,我建议您使用-Werror标志将警告转换为错误。

在这里,我使用的代码会给你一个警告,说“undefined variable c”:

#include<stdio.h>

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

但是当我-Werror在执行时使用标志时:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -Wall -Werror main.c -o linuxmi

它没有警告,而是给了我一个错误:

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

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

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

例如,在这里,我从 main.c​创建了一个名为libmain.so的共享库:

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -c -Wall -Werror -fPIC main.c

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
gcc -shared -o libmain.so main.o

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

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

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
gcc -Wall -v main.c -o linuxmi

奖励认真学习的朋友:使用文件应用 GCC 标志

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

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

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                    
touch Flags

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

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

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

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