Linux的编译器,调试器和项目的自动化构建工具
1、Linux的编译器gcc&g++
代码必须编译成可执行程序才可以运行
gcc&g++完成四步操作
1、预处理(头文件展开和宏替换)
2、编译(生成汇编代码)
3、汇编(生成机器指令)
4、链接(生成可执行程序)
命令:
gcc [选项] 需要编译的文件 [选项] 生成的目标文件
功能:
进行程序的预处理,编译,汇编,链接操作
预处理:
gcc -E 需要预处理的文件 -o 生成的目标文件.i
1.主要包括宏替换,文件包含,条件编译,去掉注释
2、预处理处理的是#开头的代码行
编译:
命令:
gcc -S 需要预处理的文件 -o 生成的目标文件.s
1、检查错误
2、生成汇编代码
汇编:
gcc -c 需要预处理的文件 -o 生成的目标文件.o
1、将编译阶段生成的汇编代码转成目标文件
2、生成机器指令
链接:
命令:
gcc 需要预处理的文件 -o 生成的目标文件
生成可执行程序
gcc默认生成的二进制程序是动态链接的
gcc的选项参数及描述
选项 | 描述 |
---|---|
-E | 生成预处理.i文件 |
-S | 生成汇编代码.s文件 |
-c | 生成机器指令.o文件 |
-o | 生成可执行程序 |
-static | 使用静态链接 |
-g | 生成调试信息 |
-fPIC | 生成位置无关代码 |
-l | 指定头文件路径 |
-L | 指定链接库名称 |
-shared | 使用动态库链接 |
-O0 | 不优化 |
-O1 | 缺省参数,表示一级优化 |
-O2 | 二级优化 |
-O3 | 三级优化 |
-w | 不生成警告信息 |
-Wall | 生成所有警告信息 |
2、Linux的调试器gdb
程序的发布方式有release版本和debug版本
Linux下使用编译器gcc&g++编译出来的程序默认是release版本
要使用gdb调试器,就必须在编译的时候加上-g选项
gdb使用的操作和描述:
操作 | 描述 |
---|---|
list+行号 | 显示调试程序的源代码,接着上次的位置往下10行 |
list+函数名称 | 列出某个函数的代码 |
r或run | 运行程序 |
n或next | 单条执行 |
s或step | 进入函数调用 |
b或break+行号 | 在某行打断点 |
b或break+函数名 | 在某个函数开头设置断点 |
finish | 执行到当前函数返回 |
p或print | 打印表达式的值,通过表达式可以修改变量的值或者函数调用 |
p+变量 | 打印变量的值 |
set var | 修改变量的值 |
c或continue | 从当前位置开始连续非单步执行 |
dekete breakpoints | 删除所有断点 |
delete breakpoints n | 删除编号为n的断点 |
disable breakpoints | 禁用所有断点 |
enable breakpoints | 启用断点 |
info breakpoints | 查看当前设置了哪些断点 |
display 变量名 | 跟踪或查看一个变量 |
undisplay | 取消对先前变量的追踪 |
util+行号 | 跳转到某行 |
bt或breaktrace | 查看各级函数调用及参数 |
i或nfo locals | 查看当前栈区的变量值 |
quit | 结束调试 |
3、Linux的项目自动化构建工具Makefile
make是一个命令,用来自动化编译Makefile文件中的指令。
example:
符号 | 描述 |
---|---|
$< | 第一个依赖对象 |
$^ | 所有依赖对象 |
$@ | 目标对象 |
工作原理:
1、make会在当前目录下找Makefile文件;
2、make’将Makefile下的第一个文件作为目标文件
3、若是依赖对象不存在,则继续向下找生产依赖对象的文件,然后逐层递归向上编译
4、若是没找到,则直接报错退出
目标对象是否需要重新生成,是根据依赖对象的最后修改时间来决定的
项目的清理:
1、执行make clean指令
2、我们将需要clean的目标文件设置为伪目标,用.PHONY修饰,伪目标的特性就是,总是被执行
3、伪目标无论如何每次都要重新生成
4、Linux下git的使用
操作 | 描述 |
---|---|
git clone url | clone资源到本地 |
git add 文件 | 将文件添加到刚下载好的路径下 |
git commit | 提交改动到本地 |
git push | 推送本地文件到GitHub服务器 |