Linux 下进行 C 或 C++ 编程时重要的 GCC 标志 |
您所在的位置:网站首页 › 文艺活动策划主题 › Linux 下进行 C 或 C++ 编程时重要的 GCC 标志 |
如果您在 Linux 下进行 C 或 C++ 编程,则必然要采用 GNU GCC 来编译 C 或 C++ 源代码生成可执行程序。 和往常一样,您可以使用标志来扩展功能。 那么让我们看看一些最重要的 GCC 标志。 为了便于理解,我将使用以下 C 程序: #includeint 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.c0 directories, 2 files 要指定输出可执行文件名,您需要做的就是在文件名后附加-o标志,如下所示: gcc main.c -o Filename例如,在这里,我将可执行文件命名为linuxmi: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc main.c -o linuxmilinuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ tree.├── a.out├── linuxmi└── main.c 0 directories, 3 files 如果您想打印每个警告以便您可以检查您的代码并使它比以往更好,请使用该-Wall标志。 linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -Wall main.c -o linuxmi例如,在这里,我将使用不初始化变量的代码: #includeint main(void){ int i; printf("\n linuxmi.com [%d]\n", i); return 0;} 当我执行代码时,它给了我一条警告‘i’ is used uninitialized:如下图 要将 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 -lLHB4.仅使用 -E 获取预处理器输出预处理是编译的第一阶段,如果你只关心第一阶段代码发生了什么,你可以使用-E标志。 在这里,我将标准输出重定向到first-stage.i文件: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -E main.c > first-stage.i如果您关心编译期间的程序集输出,可以使用-S标志轻松生成。 在这里,我生成了main.c名为 as的程序集输出main.s: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -C main.c -o compiled要在没有任何链接的情况下获得编译代码,您所要做的就是使用-C标志。 例如,在这里,我main.c在名为的文件中生成了编译代码compiled: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -C main.c -o compiled之前,我解释了如何获得预处理、汇编和编译的输出,但是如果我告诉您可以一次获得所有这些结果呢? 它非常简单,可以使用-save-temps标志轻松生成。 假设我想为 main.c文 件生成所有中间文件,所以我需要遵循给定的命令: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -save-temps main.c在测试时,我们程序员往往会忽略可能表明应用程序中存在漏洞和安全威胁的警告。 为了使您的代码坚如磐石,我建议您使用-Werror标志将警告转换为错误。 在这里,我使用的代码会给你一个警告,说“undefined variable c”: #includeint 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它没有警告,而是给了我一个错误: 对于那些处理动态链接的人来说,这个标志可能是至关重要的,尤其是共享库。 在创建共享库时,您应该拥有与位置无关的代码,以便您可以从任何地址而不是静态地址加载共享库。 例如,在这里,我从 main.c创建了一个名为libmain.so的共享库: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -c -Wall -Werror -fPIC main.clinuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -shared -o libmain.so main.o 如果您想逐行了解 GCC 对您的代码做了什么,您可以使用该-V标志来获得详细的输出。 linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ gcc -Wall -v main.c -o linuxmi如果您使用同一组标志来编译程序,拥有一个包含必要选项的文件可以为您节省大量时间。 首先,让我们使用 touch 命令创建一个文件: linuxmi@linuxmi /home/linuxmi/www.linuxmi.com ⚡ touch Flags现在,您可以使用任何您喜欢的文本编辑器来输入标志。只需确保用空格分隔它们即可。 我在文件中保存了 3 个标志: 完成添加标志后,您所要做的就是在文本文件中附加@符号: 如您所见,它将警告转换为错误并创建了所有中间文件。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |