gcc编译流程概述

前言

本篇文章介绍gcc编译器编译C文件的流程概述
比如我们创建了一个.c文件hello_gcc.c

#include <stdio.h>
int main()
{
	printf("Hello gcc!!!\n");
	return 0;
}

最简单的方式就是在终端使用命令

gcc hello_gcc.c -o hello_gcc	// 编译、汇编、链接
./hello_gcc			// 运行
Hello gcc			// 输出

也可以使用命令分布编译,这样可以查看每个流程的结果

分步编译

gcc -E

仅预处理,不编译、汇编或链接,可以生成.i文件

gcc -S

仅编译,不汇编和链接,生成.s汇编代码

gcc -c

仅编译,汇编,不链接,生成.o机器代码

gcc -o <file>

设置输出的文件名

编译器优化选项

-O0

默认选项,不进行优化处理。

-O或者-O1

优化生成代码,编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。

-O2

进一步优化。GCC 执行几乎所有支持的不涉及空间速度权衡的优化。
编译器不会执行循环展开或函数内联。

-O3

比 -O2 更进一步优化,包括 循环展开和inline 函数。

-Og

优化调试体验。 -Og 应该是标准编辑-编译-调试循环的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。 对于生成可调试代码来说,它是比 -O0 更好的选择,因为在 -O0 处禁用了一些收集调试信息的编译器传递。 与 -O0 一样,-Og 完全禁用许多优化过程,以便控制它们的各个选项不起作用。 否则 -Og 启用所有 -O1 优化标志,除了那些可能干扰调试的标志之外

警告选项

Waddress

检查是否存在可疑的内存地址使用

Wformat

检查标准库函数的使用格式是否正确,比如printf的格式化字符串中的格式符和对应的参数是否匹配

Wunused-function

对已声明但是未定义的静态函数和未被使用的非内联静态函数发出警告

Wswitch

当用switch用于枚举类型时,判断分支是否包含所有枚举值,否则发出警告

Wunused-variable

对声明但未被使用的变量发出警告

Wunused-but-set-variable

对声明且被赋值但未被使用的变量发出警告

Warray-bounds=1

数组越界检查,需启用选项-ftree-vrp

其他常用选项

gcc -B <directory>

添加<directory>文件夹到gcc编译搜索的路径

gcc --help

显示gcc帮助信息

gcc --version

显示编译器的版本信息

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc -dumpversion

显示编译器的版本

4.8

gcc -dumpmachine

显示编译器的目标处理器

x86_64-linux-gnu
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值