一、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
  1. gcc默认不生成调试信息
  2. 如果以debug方式发布,必须携带 -g
  3. 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 -- 查看当前栈帧局部变量的值
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐