"木叶飞舞之处"

  • 一, gcc编译器
  • 二, gcc的编译过程
    • 1--完整版
      • 1. 预处理
      • 2. 编译
      • 3. 汇编
      • 4. 链接:
    • 2--简化版
      • 简化编译过程
    • 3--编译完成
  • 三, g++重要编译参数
    • 1. 使能gdb调试
    • 2. 优化代码
    • 3. 指定库路径-l和-L
    • 4. 指定头文件搜索目录-I
    • 5. -Wall 打印警告
    • 6. -w 关闭警告
    • 7. -std=c++11 设置编译标准
    • 8. 定义宏

一, gcc编译器

  1. GCC编译器支持编译GO, Objective-C, Objuctive-C++,D等程序;
  2. Linux开发C/C++一定要熟悉GCC
  3. VSCode是通过调用GCC编译器来实现C/C++的编译工作的;
  • 实际使用中:
  • 使用gcc指令编译C代码
  • 使用g++指令编译C++代码

二, gcc的编译过程

1–完整版

为了便于理解一个gcc的编译过程,将完整的代码编译过程分为以下四步(现在已经简化为一句代码就可实现这几句话),以一个test.cpp文件编译成可执行文件为例:

1. 预处理

预处理-Pre-processing: 生成.i文件

# -E 选项 代表指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i

2. 编译

编译-Compiling: 生成.s文件

# -S 告诉C++代码产生汇编语言
# g++ 产生的汇编语言文件缺省扩展名是 _s
g++ -S test.i -o test.s

3. 汇编

汇编-Assembling: 生成.o文件

# -c 告诉C++代码产生机器语言
# g++ 产生的机器语言的缺省扩展名是.o
g++ -c test.s -o test.o

4. 链接:

链接-Linking: 生成.bin文件

# -o 表示为可执行文件重新命名,之前的-o都是
g++  test.o -o test

2–简化版

简化编译过程

一步代码融合了上述四个步骤:
如果没有-o参数,会默认生成a.out可执行文件

g++ test.cpp -o test

3–编译完成

同级目录下出现了test可执行文件,运行:

./test

即可执行

三, g++重要编译参数

1. 使能gdb调试

  • -g选项允许gcc产生带调试信息的可执行文件test
g++ -g test.cpp -o test

2. 优化代码

  • -O[n]中,一般选择-O2, n的取值如下:
  • -O:同时减小代码长度和执行时间,其效果等价于-O1
  • -O0: 表示不做优化
  • -O1为默认优化
  • -O2:在-O1基础上,进行一些额外调整,如指令调整
  • -O3:包含循环展开和其他优化工作
# 这样出来的程序,运行时间和文件大小都优化了,time ./test指令可以查看运行时间
g++ -O2 test.cpp -o test

3. 指定库路径-l和-L

  • -l参数(小写)就是用来制定程序要链接的库,-l后接库名,没有空格
  • 在/lib /usr/lib /usr/local/lib 里的库直接用-l就可以链接
g++ -lglog test.cpp -o test
  • -L参数可以制定库文件没在上述三个目录中的库文件,后接库名无空格
g++ -L/home/home/qinsir/mylib -lmytest test.cpp -o test

4. 指定头文件搜索目录-I

  • /usr/include目录一般不用指定
  • 不在上述目录的,需要用-I(大写)参数指定
  • -I可以用相对路径,不如头文件在当前,就可以用-I.来指定
g++ -I/. test.cpp -o test

5. -Wall 打印警告

  • 打印出gcc提供的警告信息
g++ -Wall test.cpp -o test

6. -w 关闭警告

用法同上

7. -std=c++11 设置编译标准

  • 使用c++11标准编译test.cpp
g++ -std=c++11 test.cpp -o test

8. 定义宏

  • -DDEBUG定义DEBUG宏,可能文件中含有DEBUG宏部分的相关信息,用DDEBUG来选择开启或关闭DEBUG
  • -Dname定义宏name,默认定义内容为字符串1
  • 博主自己认为可以用来作为负责开关的调试变量
gcc -DDEBUG main.cpp -o test

main.cpp文件内容:

int main()
{#ifdef DEBUGprintf("DEBUG LOG\n");#endifprintf("in\n") ;
}

按照上述编译,DEBUG为真,输出"DEBUG LOG"

【gcc/g++】1.编译器, 编译过程和基本参数相关推荐

  1. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...

  2. 【Linux-GNU编译器套件(gcc/g++/gfortran)离线编译安装】

    文章目录 Linux-centos7.9系统GNU编译器套件(gcc/g++/gfortran)离线编译安装 一.★GNU编译器套件定义 二.★GNU-GCC编译环境说明 三.★GNU-GCC编译安装 ...

  3. 深度剖析“GCC编译器编译过程”

    (这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来) 首先说说第一步 一.预编译 1.配置编译器环境  编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件 ...

  4. nvcc gcc g++混合编译器编程

    nvcc gcc g++混合编译器编程 有很多同鞋问怎么使用CUDA和其它的编译器连用呢?混合编程? 先吧代码贴出来: 文件1 : test1.cu [cpp] view plaincopy //文件 ...

  5. g++编译命令使用以及参数详解

    gcc & g++现在是gnu中最主要和最流行的c & c++编译器 . g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可.其实是无关紧要的. ...

  6. GCC 使用-C语言编译过程

    任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...

  7. GCC编译过程以及对应FILE文件表

    gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理:生成.i的文件[预处理器cpp] (2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).汇编:有汇编变 ...

  8. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  9. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程

    通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...

最新文章

  1. Thrift源码解析--TBinaryProtocol
  2. 项目分发系统-expect
  3. java中怎么剪切文件_java中实现文件复制、剪切和删除
  4. 在RHEL5.4上做YUM
  5. 作品第四课----agruments应用一求出函数参数的总合
  6. Linux 下搭建Apache,Linux 下搭建Apache 服务器
  7. 第十节:利用async和await简化异步编程模式的几种写法
  8. linux mpc8313启动流程,基于MPC8313E和FPGA的双口RAM驱动开发
  9. 笨办法学 Python · 续 练习 52:`moreweb`
  10. 列举python的数据类型_Python的数据类型
  11. java 权限管理与用户角色权限设计
  12. 第一个神经网络代码分享
  13. 字符串转数组的几种方法和字符串的截取
  14. Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅
  15. matlab画出n的阶乘,matlab计算n的阶乘函数程序
  16. 计算机视觉教程章毓晋课后答案6,计算机视觉教程 教学课件 章毓晋 CCV01.pdf
  17. 无线上网认证之Portal认证
  18. 教你自己如何在Windows10系统创建虚拟专用网络
  19. 搭建Springboot单体项目
  20. 测试开发岗-高频知识整理【校招】 ,内附面试题答案!

热门文章

  1. JavaScript红皮书学习笔记
  2. 电商用户价值分析——基于RFM模型、KMeans聚类
  3. java随机生成车牌号函数
  4. 什么叫横向比较和纵向比较
  5. ACCU天气API以及Okhttp、Retrofit、RxJava的使用
  6. BLE MESH组网(一)简介和基本概念
  7. 15、ESP-MESH组网
  8. Visual studio 2019使用Microsoft Speech SDK 5.1语音识别
  9. java if 跳出循环_break跳出的是if语句,还是for循环?
  10. 【PTA 7-11】骑士的金币