Linux操作系统 --- 开发工具
一、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 所有链接要求都变成静态链接
(4)debug release
A. -g:以debug的形式发布 优点:可以调试 可以查看源码
B. 原始版本为release 优点:优化 无调试信息
二、make/Makefile
1. 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. 安装yum
yum install git
2. 具有网络功能的版本控制器
开源 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调试器--gdb
- gcc默认不生成调试信息
- 如果以debug方式发布,必须携带 -g
- gdb 可执行文件
- 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的值为num
- quit/q -- 结束调试
- bt -- 查看各级函数调用及参数
- i -- 查看当前栈帧局部变量的值
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)