
一、Linux编译器--gcc/g程序翻译过程预处理 .i - 编译 .s - 汇编 .o - 链接 - .out/可执行文件1. -E告诉gcc进行程序翻译、预处理结束就行头文件展开 宏替换 条件编译-E 源文件名 -o 文件(后缀名为.i)2. gcc file_name1 -o file_name2-o-- 可重命名用途直接形成可执行文件3. -S将 -E 后的预处理文件翻译为汇编文件编译处理结束就行-S源文件-o 文件(后缀名为.s)4.-c将 -E 后的汇编文件翻译为机器码可重定位目标二进制文件-c源文件-o可垂直定位目标二进制文件(后缀名为.o)(简称目标文件)(不可以独立执行需要链接才可以执行)*链接库 -- 提供方法的实现 -- 将源文件.c进行一定的翻译打包头文件 -- 提供方法的说明c语言标准库 -- 本质为一个有路径的文件 -- Linux(.so -- 动态库 .a -- 静态库) Windows(.dll -- 动态库 .lib -- 静态库)5. .o(目标文件)如何与库进行链接(动态链接 静态链接)1在linux中编译形成可执行程序默认采用的就是动态链接--提供动态库在linux中如果要按照静态链接的方式进行形成可执行程序需要添加static动态链接 -- 程序编译链接阶段不拷贝库代码仅记录库函数符号与依赖信息。程序运行阶段由系统动态链接器加载动态库(.so)进行地址重定位、完成函数符号绑定与链接。多个程序可以共享同一份动态库(核心库代码独立存放运行时绑定)静态链接 -- 程序编译链接阶段链接器将程序调用的库函数从静态库(.a)中提取目标代码直接拷贝合并到最终可执行文件中。程序运行时不再依赖任何外部库完全独立运行(核心可代码打包进程序链接时绑定)2动态库 静态库定义优点缺点动态库.so库代码独立存放编译时仅记录符号与依赖运行时由动态链接器加载库文件再完成链接重定位为共享库有效节省资源磁盘空间等一旦缺失各个相关程序不工作静态库.a目标文件(.o)的集合编译链接时链接器会将程序用到的库代码直接复制拷贝到可执行文件中不依赖库程序可独立运行体积大消耗资源若无静态库但就要-static(进行静态链接)是否可行不可行若无动态库只有静态库gcc可以找到静态库可以进行静态链接 -- gcc默认优先进行动态链接-static要求全部静态链接如果系统没有对应静态库报错3不一定所有的文件的链接都是单一的动态链接或者静态链接是混合的-static 所有链接要求都变成静态链接4debug releaseA. -g以debug的形式发布 优点可以调试 可以查看源码B. 原始版本为release 优点优化 无调试信息二、make/Makefile1. make -- 一条指令Makefile -- 一个当前目录下的文件目标文件依赖文件执行命令2. 依赖关系 依赖方法依赖关系生成这个文件需要哪些文件为前提(make会自动推导makefile中的依赖关系 -- 有向无环图DAG)依赖方法[目标 依赖] make会自动判断是否需要重新编译3. 如何清理怎样做到清理clean依赖关系为空(建议放在后面)4. 为什么只允许编译一次提高效率make会根据源文件和目标文件的新旧判断是否需要重新执行依赖关系进行编译(依赖关系不一定总是被执行的).PHONY:伪目标文件 -- 表示总是被重新编译两个文件新旧时间进行比较的依据时间戳5. 特殊符号1$ -- 依赖关系冒号左侧内容2$^ -- 依赖关系冒号右侧内容3 -- 依赖方法不显示6. 进度条项目1回车换行 \r --- 回到当前行开头 \n --- 光标下一行2缓冲区 -- 由语言维护的一段内存三、Git --- 分布式版本控制系统 client/server一体1. 安装yumyum install git2. 具有网络功能的版本控制器开源 client和server一体3. 如何使用复制在gitee中创建的项目链接下载项目到本地4.其他问题git log -- 查看提交记录git init -- 初始化git clone url -- 克隆git status -- 查看提交状态git add 文件 -- 添加git commit -m message -- 提交git push -- 上传git pull -- 下载更新.gitgnore -- 文件包含的后缀名只要预上传的文件中含有就不会被上传可手动添加首次使用需要配置用户名和邮箱四、Linux调试器--gdbgcc默认不生成调试信息如果以debug方式发布必须携带 -ggdb 可执行文件l -- 函数名可查看函数 l num -- 从num行显示代码r -- 运行程序b num -- 在num行打断点info b -- 查看断点信息d num -- 删除编号为num的断点n -- 逐过程不进入函数s -- 逐语句进入函数p name -- 打印变量值display name -- 常显示变量/… undisplay num -- 取消编号为num的变量的常显示until num -- 跳转至指定行finish -- 运行完一个函数c -- 继续运行直到下一个断点/程序结束disable num -- 关闭编号为num的断点不删除enable num -- 打开编号为num的断点 open状态set var name num -- 修改变量名为name的值为numquit/q -- 结束调试bt -- 查看各级函数调用及参数i -- 查看当前栈帧局部变量的值