前言
本篇文章介绍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