Linux C++ gcc常用选项

1,321 阅读6分钟

gcc选项有上百个之多,对于我们来说,我们只需要熟悉一些常见的命令即可。

1.选项-x 选项-x可以告诉gcc要编译的源文件是什么语言的文件,而不是用根据后缀类型进行判断。 当然了,我们可以让其自行推断语言类型。

使用man gcc命令来查看gcc的帮助文档,然后我们找到选项-x的说明:

   -x language
              明确 指出 后面 输入文件 的 语言 为 language (而不是 从 文件名后缀 得到的 默认选择). 这个选项 应用于 后面 所有的 输入文件, 直到 遇着 下一个 `-x'
              选项. language 的 可选值 有 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', 和 `assembler-with-cpp'.

       -x none
              关闭 任何 对 语种 的 明确说明, 因此 依据 文件名后缀 处理 后面 的 文件 (就象是 从未 使用过 `-x' 选项).

       如果  只操作  四个阶段  (预处理, 编译, 汇编, 连接) 中的 一部分, 可以 使用 `-x' 选项 (或 文件名后缀) 告诉 gcc 从 哪里 开始, 用 `-c', `-S', 或 `-E' 选项
       告诉 gcc 到 哪里 结束. 注意, 某些 选项组合 (例如, `-x cpp-output -E') 使 gcc 不作 任何事情.

我们来看个示例:

我们有下面一段代码,文件名称为hello.c:

在这里插入图片描述
然后我们使用gcc编译,当然了我们知道只是一个c语言文件,这里我们如果使用上面的参数assembler即以汇编语言进行编译,会出现什么效果呢?
在这里插入图片描述
很明显我们提供的代码文件不是汇编语言,所以gcc无法搞定这个文件了。

此时我们在使用c/c++参数来编译:

在这里插入图片描述
可以看到结果是ok的。当然了,我们亦可以不指定-x参数,此时编译器会自动根据文件的后缀名来判断语言类型来编译。

如果我们把文件改造一下,让hello.c使用c++的特性比如就使用个标准输入输出吧:

在这里插入图片描述

此时我们没有改变文件的后缀,仍然是hello.c ,我们试着编译一下:

在这里插入图片描述
显然无法把c++语言当成c语言来处理,关键是我们使用了c++语言的特性。

那么不改后缀名称的情况下如果使用-x c++ 参数能否正确的编译呢?

在这里插入图片描述

这里我们需要说明一下出现错误的原因:

对于gcc后缀文件,编译的时候可以用gcc/g++,但是链接的时候要用g++,因为gcc和g++在编译的时候是相同的,但是链接阶段g++默认链接c++库,gcc没有。

所以一般情况下用gcc编译c文件,用g++编译cpp文件。如果要用gcc编译cpp文件,后面需要加上-lstdc++,这个的作用是链接c++库。但是g++可以编译c文件。

我们在加上-lstdc++试试:

在这里插入图片描述

2.选项-o 选项-o用来指定要生成的结果文件,后面跟的是结果文件的名字。

默认情况下,如果不指定-o参数:

在这里插入图片描述
会生成一个名称为a.out的结果文件,我们可以运行一下:
在这里插入图片描述

如果我们指定了-o参数,那么输出的结果文件就是我们指定的文件名称了:

在这里插入图片描述

3.选项-c 选项-c告诉gcc对源文件进行编译和汇编,但是不进行链接,此时生成的不是可执行文件。

如果我们不指定目标文件名称,会默认生成一个同名的.o文件。

在这里插入图片描述

4.选项 -I (i的大写) -I 用来指定头文件所在的文件夹路径,用法为:-I dirpath

帮助文档:

 -Idir  在 头文件 的 搜索路径 列表 中 添加 dir 目录.

这里我们说明一下gcc对于头文件的搜索路径的过程。

对于源代码中使用尖括号包含的头文件,比如

#include <iostream> 

gcc会在-I参数指定的路径搜索需要的头文件,如果没有找到,那么会在标准默认路径

/usr/local/include

下进行搜索,若还是没有找到,再到标准默认路径

/usr/include

下进行查找,若还没有找到,那么恭喜你,出错了。

对于源代码中使用双引号包含的头文件 ,比如:

#include "constant.h"

gcc首先会在当前工作目录下搜索,如果没有找到,则在-I参数指定的路径进行搜索,若还是没有找到,那么就会查找标准默认路径:

/usr/local/include

若还没没有找到,则在标准默认路劲:

/usr/include

若在找不到,恭喜你,又出错了。

下面我们通过一个例子来看下,首先我们创建两个不同的目录:

在这里插入图片描述
其中constant用来存放我们的常量头文件,在这个目录下,新建constant.h 并输入下面的内容:

#define MAX_NUMBER 1024

在main目录下新建main.c,并输入下面的内容:

[lwq@localhost main]$ cat main.c
#include <stdio.h>
#include "constant.h"

int main(){

printf("最大可支持的数字为:%d\n",MAX_NUMBER);

return 0;
}

进入main目录,编译main.c:

在这里插入图片描述

此时我们没有指定contant.h的路径,编译报错,接下来我们使用-I参数:

在这里插入图片描述

可以看到,程序可以正常编译,并且执行结果就是我们预期的1024. 5. 选项 -include -include file 在 处理 常规 输入文件 之前, 首先 处理 文件 file, 其结果是, 文件 file 的 内容 先得到 编译. 命令行上 任何 -D' 和-U' 选项 永远 在 -include file' 之前 处理, 无论 他们 在 命令行上 的 顺序 如何. 然而-include' 和 `-imacros' 选项 按 书写顺序 处理.

选项-include命令用来包含头文件。

注意:如果在阅读一些开源代码的时候,在源代码中没有找到头文件引用的代码语句,但是确实使用了别的头文件内容,大家一定要想起-include参数,这样大家也能少花费一些不必要的事件。

还是拿上面的代码为例,我们删除main.c中关于constant.h的头文件引用代码:

#include <stdio.h>

int main(){

printf("最大可支持的数字为:%d\n",MAX_NUMBER);

return 0;
}

编译程序:

在这里插入图片描述

使用-include 参数指定constant.h的头文件路径:

在这里插入图片描述

  1. 选项 -Wall 选项-Wall 用来显示所有的警告信息。 使用:
gcc main.c -o main -Wall
  1. 选项 -g 选项 -g 可以产生供gdb调试的可执行文件,即可执行文件中包含可供gdb调试器进行调试的信息。 使用:
 gcc main.c -o main  -g

在这里插入图片描述

大家可以看到使用-g参数后,可执行文件的文件大小明显变大了。

  1. 选项 -pg 选项 -pg用来生成供gprof 剖析用的可执行文件,其中gprof是linux下对c++程序的一种性能分析的工具。

使用:

gcc main.c -o main   -pg
  1. 选项 -l 选项-l用来链接动态链接库,也就是可执行文件运行过程中需要用到的一些函数库。

用法:

gcc main.c -o main -lstdc++ 

注意一点 -l和后面的标准库名字之间是没有空格的。