当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/253222.html

相关文章:

  • 【web安全】ssrf漏洞的原理与使用
  • 佳易王会员管理软件店铺积分以及积分兑换系统
  • Django回顾【二】
  • [Ubuntu 18.04] RK3399搭建SSH服务实现远程访问
  • Linux进程间通信之共享内存
  • lv11 嵌入式开发 RTC 17
  • c语言指针详解(上)
  • 如何删除mac苹果电脑上面的流氓软件?
  • WordPress(11)给文章添加预计阅读时长
  • 周周爱学习之快速排序
  • 国产接口测试工具APIpost
  • MySQL电商管理系统练习题及答案
  • 每日3道PWN(第二天)
  • SAP STMS传输请求
  • L1-009:N个数求和
  • 当发送“Hello,World”时,channel发生了什么?
  • 服务器运行情况及线上排查问题常用命令
  • Hadoop学习笔记(HDP)-Part.18 安装Flink
  • LeetCode56. 合并区间
  • 解决typescript报错:找不到名称xxx
  • UVM中封装成agent
  • OSI七层模型与TCP/IP四层模型
  • QT 中 QProgressDialog 进度条窗口 备查
  • 学习ShardingSphere前置知识
  • 读书笔记-《数据结构与算法》-摘要3[选择排序]
  • Arduino驱动MLX90614红外测温传感器(温湿度传感器)
  • Ubuntu上传文件到SMB共享文件夹
  • 【Linux】基础IO--重定向理解Linux下一切皆文件缓冲区
  • RINEX介绍
  • ROS-ROS通信机制-服务通信