【gcc/g++】1.编译器, 编译过程和基本参数
"木叶飞舞之处"
- 一, 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编译器
- GCC编译器支持编译GO, Objective-C, Objuctive-C++,D等程序;
- Linux开发C/C++一定要熟悉GCC
- 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.编译器, 编译过程和基本参数相关推荐
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
例子:由多个源文件组成的C程序,经过编辑.预处理.编译.链接等阶段才能生成最终的可执行程序.此过程中,在__c__阶段可以发现被调用的函数未定义. A. 编辑和预处理 B. 预处理 C. 编译 D. ...
- 【Linux-GNU编译器套件(gcc/g++/gfortran)离线编译安装】
文章目录 Linux-centos7.9系统GNU编译器套件(gcc/g++/gfortran)离线编译安装 一.★GNU编译器套件定义 二.★GNU-GCC编译环境说明 三.★GNU-GCC编译安装 ...
- 深度剖析“GCC编译器编译过程”
(这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来) 首先说说第一步 一.预编译 1.配置编译器环境 编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件 ...
- nvcc gcc g++混合编译器编程
nvcc gcc g++混合编译器编程 有很多同鞋问怎么使用CUDA和其它的编译器连用呢?混合编程? 先吧代码贴出来: 文件1 : test1.cu [cpp] view plaincopy //文件 ...
- g++编译命令使用以及参数详解
gcc & g++现在是gnu中最主要和最流行的c & c++编译器 . g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可.其实是无关紧要的. ...
- GCC 使用-C语言编译过程
任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...
- GCC编译过程以及对应FILE文件表
gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理:生成.i的文件[预处理器cpp] (2).编译:将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).汇编:有汇编变 ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...
最新文章
- Thrift源码解析--TBinaryProtocol
- 项目分发系统-expect
- java中怎么剪切文件_java中实现文件复制、剪切和删除
- 在RHEL5.4上做YUM
- 作品第四课----agruments应用一求出函数参数的总合
- Linux 下搭建Apache,Linux 下搭建Apache 服务器
- 第十节:利用async和await简化异步编程模式的几种写法
- linux mpc8313启动流程,基于MPC8313E和FPGA的双口RAM驱动开发
- 笨办法学 Python · 续 练习 52:`moreweb`
- 列举python的数据类型_Python的数据类型
- java 权限管理与用户角色权限设计
- 第一个神经网络代码分享
- 字符串转数组的几种方法和字符串的截取
- Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅
- matlab画出n的阶乘,matlab计算n的阶乘函数程序
- 计算机视觉教程章毓晋课后答案6,计算机视觉教程 教学课件 章毓晋 CCV01.pdf
- 无线上网认证之Portal认证
- 教你自己如何在Windows10系统创建虚拟专用网络
- 搭建Springboot单体项目
- 测试开发岗-高频知识整理【校招】 ,内附面试题答案!