C程序编编译的过程分为如下四个阶段

1.预处理:头文件展开(#include)、宏替换(#define)、条件编译(#ifdef)(.i)使用预处理器(预处理阶段处理的都是以#开头的代码)

2.编译:检查语法、转成汇编、生成汇编文件(.s/.S)使用编译器

3.汇编:由汇编变为目标代码(机器代码)生成目标文件(.o)使用汇编器as

4.链接:链接所有目标文件,生成可执行程序,使用链接器ld

gcc编译命令的常用选项

(0)-Wall:开启所有警告(可以理解为warinig all),使用它能够使GCC产生尽可能多的警告信息。(非常推荐使用该选项)
GCC给出的警告信息虽然从严格意义上说不能算作错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持标准、健壮的特性使用它能够使GCC产生尽可能多的警告信息。。所以将警告信息当成编码错误来对待,是一种值得赞扬的行为!

看下面这张图,第一眼看到这个警告的时候,有点没搞明白是什么意思,因为平时很少会碰到这种警告,回到源代码中,检查的时候也没有发现问题在哪,直到翻译了这个才明白是怎么一回事。。。

警告:建议将赋值作为真值使用


原来是我将判断语句,误写成了赋值语句,这会导致什么后果呢?那就是,无论rate为何值时,这个后面跟的语句都会执行。
而这种警告,编译器一般是不会抛出来,因为这个语句是合法的 (lll¬ω¬)
加了-Wall选项后就不一样了,它会抛出你代码中很多的一些小问题,像声明的变量在代码中没有用到也会抛出警告。
总之,编译的时候加上-Wall选项,有百利而无一害

(1)-E:只进行预处理(.i)

gcc -E demo.c > demo.i :将预处理信息放到.i文件中

(2)-S:只激活预处理和编译,就是指把文件编译成为汇编代码。(.s/.S)

(3)-c:只激活**预处理,编译,和汇编,**也就是他只把程序做成obj文件(.o)

(4)-o:指定编译生成的文件名

(5)-g 生成调试信息。GNU 调试器可利用该信息。

(6)-I(大写i)+路径:指定头文件的第三方搜索路径

  • #include “stdio.h”和#include <stdio.h>的区别:搜索路径不同
  • < >:在系统头文件目录(/usr/include)中搜索,若没有,则报错
  • “ ”:先在当前目录中搜索,若没有,则去系统头文件目录中搜索,若还没有,在报错
  • 规范:<> :包含系统头文件 “”:包含自定义文件

(7)-L:指定链接所需库(动态库或静态库)所在路径

(8)-l(小写L):指定所需链接库的库名

(9)-static:强制使用静态链接库
默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库

(9)-O1 -O2 -O3:编译优化
gcc -O1 demo.c -o demo :一级优化
gcc -O2 demo.c -o demo :二级优化
gcc -O3 demo.c -o demo :三级优化
(time ./demo:可以测算代码运行的时间)

(10)-w:关闭警告
gcc -w demo.c -o demo
(不推荐使用,警告可能不影响程序的执行,但忽视警告运行时可能会造成程序上的一些问题)

(11)-O1 -O2 -O3:编译优化
gcc -O1 demo.c -o demo :一级优化
gcc -O2 demo.c -o demo :二级优化
gcc -O3 demo.c -o demo :三级优化
(time ./demo:可以测算代码运行的时间)

(12)-fPIC:生成位置无关的代码,适用于动态链接

(13)-shared:生成共享目标文件,通常用在建立共享库时。

gcc编译命令的常用选项——强烈推荐大家使用 -Wall 选项相关推荐

  1. gcc/g++ 命令的常用选项

    gcc/g++ 命令的常用选项 使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错.假如在程序中用到new delete操作,而 ...

  2. Gcc编译链接及常用选项总结

    转载文章:http://www.franktly.com 前言 GNU CC(简称Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object- C等语言编写的程序.Gcc ...

  3. gcc编译c文件常用命令参数解释

    gcc编译c文件 gcc是常用来编译c语言程序的编译器,了解它编译c语言的命令参数,对c/c++语言的学习是有一定好处的. gcc编译文件一步到位的命令格式 gcc main.c -o main.ex ...

  4. GCC 编译命令和基本使用

    gcc编译一个c文件的过程,会经过几个步骤:预编译,编译,汇编,链接. 编译命令 -E:预编译, 讲带#的语句重新展开到制定文件中 比如#define, #include "*.h" ...

  5. Linux gcc编译简介、常用命令

    gcc作为linux平台下的标准C编译器,功能很强大.格式如下: gcc [option] [filename] -x language 指定使用的语言 -c 对文件进行编译和汇编,但不进行连接 -S ...

  6. gcc 编译命令选项$@ $^ $

    一些常见的自动化变量说明如下: (1) $@ --目标文件的名称: (2) $^ --所有的依赖文件,以空格分开,不包含重复的依赖文件: (3) $< --第一个依赖文件的名称. (4) $?  ...

  7. Linux GCC 编译过程分析及常用检错的编译选项

    文章目录 简介 一.拆解编译过程 1.准备源程序 2.分析拆解过程 3. 多个程序文件的编译 4.检错的编译选项 1.-pedantic 编译选项 2.-Wall 编译选项 3.-Werror 编译选 ...

  8. Linux gcc编译命令

    编写一个C程序 1.用文本文件编写代码 用 touch 命令:"touch 文件名" 可以创建一个文件(比如 touch hello.c),如下图: 在命令行输入 touch he ...

  9. gcc 编译C语言最全命令

    gcc 编译命令 最简单的编译命令是:     gcc main.c 默认生成的可执行文件是 a.out 如果需要指定输出文件,则需要使用如下的命令:     gcc main.c – o main ...

最新文章

  1. 邮件服务器SASL TLS 反垃圾邮件系统
  2. spring整合mybatis是如何配置事务的?
  3. python3虚拟环境搭建_python3 =虚拟环境的搭建
  4. C#结构体中数组的分配
  5. 局域网网管软件_网管软件有哪些?那些不同之处
  6. geoda权重矩阵导入matlab,空间计量经济学-分析解析.ppt
  7. mysql java dbutil_Java -- DBUtils 框架 操作MySQL数据库
  8. python玩转单片机_Python玩转单片机:从基础到进阶,几款主流的开发板大盘点!...
  9. J1939协议之通俗易懂----简介
  10. 数学分析教程(科大)——2.6笔记+习题
  11. 高数 | 【不定积分】基础知识点梳理 及 经典例题、李林880求不定积分例题
  12. JavaScript 资源大全
  13. 因果分析.科学实验评估
  14. 吸人大法!最吸引人气的网吧LOL活动策划方案,此秘籍值得收藏!
  15. 主数据管理方法论之主数据全生命周期管理
  16. (极光推送)短信验证码
  17. 内分泌6项检查费用_内分泌6项检查费用是多少 详解内分泌6项检查是什么
  18. 2017计算机研究生专业排名,2017年USNews美国大学计算机硕士研究生专业排名TOP110...
  19. [微机原理]多点模拟量计算机数据采集实验
  20. 发票识别100%智能

热门文章

  1. Android11不申请储存权限,Dolphin 模拟器开发者:由于 Android 11 存储权限收紧,模拟器功能将受限...
  2. 用Natapp(ngrok)进行微信本地开发调试
  3. 牛逼!JetBrains 又出了一款编程神器!协同编程!
  4. Wifi控制帧:RTS/CTS和ACK
  5. android照片美颜项目_MagicCamera: MagicCamera 是 Android 平台开源相机项目,具有包括实时美颜等40种实时滤镜,功能包括对图片进行磨皮/美白等后期处理...
  6. matlab 脸部血容积脉搏波,脉搏血氧仪中光电容积脉搏波的软件检出方法
  7. Lab BGP Dampening
  8. 量纲分析-破解原子弹爆炸能量的利器
  9. Unity制作多屏幕解决方案
  10. Post请求和Get请求的区别