Linux C++ gcc常用选项

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和后面的标准库名字之间是没有空格的。

转载于:https://juejin.im/post/5ca5e153f265da30807feddc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值