Linux系统编程之基本知识

Linux系统编程之基本知识

首先我们梳理一下Linux系统编程需要些什么基础。

1.vim操作基础 在新版本的Linux情况下,除了vim这个编辑器工具,还有其他的一些编辑工具
类似gedit、nano…等等文本编辑工具,没有文本编辑工具没办法对代码进行编辑。
vim的操作难度较高,指令很多很新(相对于用惯正常键盘用键的人来说
解决办法有1.学习vim指令2.下载插件3.使用其他便捷的文本编辑工具。

首先vim指令是必学的,这很重要。因为不是所有的linux都有图形化界面,当没有图形化界面的时候,vi成为你唯一的工具。

除此以外还推荐nano、vscode等工具。

2.gcc操作基础

3.gdb调试基础

4.Makefile编写基础

有了以上的这部分操作基础以及预备知识就已经可以说是在Linux环境下c/c++编程入门了。

Vim指令

Vim的工作模式

Vim有三个模式:
命令模式
编辑模式
末行模式

如何切换

命令模式------>编辑模式: i a o I A O s S 这些都可以,而且每一个都有特殊的含义

vim常用指令操作:

明日补充
vsp

gcc操作

gcc操作的四个步骤(必记)

1.预处理 gcc -E 生成.i文件 作用:展开宏以及头文件 清除无用的条件编译(替换条件编译)、还有一个(忘了 是删除注释、空行、空白
2.编译 gcc -S 生成.s 文件 作用是检查语法规范
3.汇编 gcc -c 生成.o文件 作用是将汇编语言翻译成机器指令 .o是二进制文件
4.链接 gcc 生成最后的可执行文件

四个步骤中的注意事项

  1. gcc编译可以单独执行其中的步骤,但是这四个步骤是环环相扣,意思就是执行第二步必须先执行第一步,执行第三步必须先执行第一、第二步。
  2. gcc编译过程中最耗时和耗费系统资源的就是第二步。
  3. gcc链接
  4. gcc

gcc操作参数

常用gcc参数(必记)

-I 用来帮gcc 指定头文件路径 有些时候头文件在某个文件夹目录中 而不是与.c文件在同一个目录中
这时候就需要用到这个参数

-g 生成调试文件

-v 查看编译器版本

-D 编译时指定宏定义 类似在外部做一个全局宏定义

-Wall 把所有的可能的警告信息全部显示出来

-On n是优化等级 n:0-3

-c 把汇编文件转换成二进制文件

静态库与动态库

静态库与动态库在大工程常常出现,严格来说,他是不属于gcc的内容的,但是gcc 编译常常用到他们。

静态库的概念

静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。是.a文件

由来

为了加快编译速度
但是目前编译已经很快了,常常用作制作者提供函数功能给他人调用,但是不希望别人看到自己的源码实现。于是制作静态库链接

静态库与动态库的区别

它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。

静态库:适用于对时间要求高,对空间要求不高的程序
动态库:适用于对空间要求高,对时间要求不高的程序

静态库的制作

工具:ar
指令: rcs

具体步骤: 有点记不清了(

静态库的编译注意事项
  1. 命名格式 lib库名.a
  2. 首先要注意在gcc中加入 自己的库
  3. 其次要编写自己库的头文件且包含在工程主的源文件,不然函数都是隐性声明:很容易出问题
动态库(暂时跳过 埋个坑

GDB调试基础 (还是暂时跳过 埋个大坑

Makefile编写基础

Makefile的命名

makefile、Makefile

存在意义:

makefile的必记一二三

学完就等于入门makefile

一个规则:(总的来说,makefile的

目标:依赖条件
一个tab的缩进+命令 必须有这个一个tab的缩进,而且必须只能是一个tab的缩进

至于命令就是gcc命令啦(需要多些gcc命令)

两个函数:

wildcard函数

通配符函数、或叫百变牌函数(手动滑稽
作用:查找目录下指定类型的文件,并且最终返回一个环境变量

需要注意的是必须用$符号(刀了符号)去提取返回的这个环境变量,并且将其赋值给另外一个环境变量使用

基本语法:

src = $(wildcard ./*.c)  # 意义就是找到当前目录的所有.c文件并取出来,然后赋值给#src普通变量

patsubst函数

没有具体这个函数的英文翻译 只能通过拼读来记忆他了

作用就是 把文件后缀改成别的格式 单纯更改格式,没做别的其他处理

####### 基本语法

三个参数:
搞定问题:我是谁,从哪里来,到哪里去
参数一 :我是谁:具体的修改文件是什么
$(src)

参数二:从哪里来 (原来是什么文件)
%.c

参数三:到哪里去 (要修改为什么文件)

%.c

需要注意的是:必须用$符号获取环境变量的值
具体示例

obj = $(patsubst %.c,%.o,$(src))

三个自动变量

模式规则

你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%“字符。”%“的意思是表示一个或多个任意字符。在依赖目标中同样可以使用”%",只是依赖目标中的"%"的取值,取决于其目标。
而不再是用确定的文件、确定的符号去编写你的规则

三个自动变量的定义

关于自动化变量可以理解为由 Makefile 自动产生的变量。在模式规则中,规则的目标和依赖的文件名代表了一类的文件。规则的命令是对所有这一类文件的描述。我们在 Makefile 中描述规则时,依赖文件和目标文件是变动的,显然在命令中不能出现具体的文件名称,否则模式规则将失去意义。

$@

表示规则的目标文件名。如果目标是一个文档文件(Linux 中,一般成 .a 文件为文档文件,也成为静态的库文件),
那么它代表这个文档的文件名。在多目标模式规则中,它代表的是触发规则被执行的文件名。

$^

代表的是所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有的库成员(.o 文件)名。
一个文件可重复的出现在目标的依赖中,变量“ ” 只 记 录 它 的 第 一 次 引 用 的 情 况 。 就 是 说 变 量 “ ^”只记录它的第一次引用的情况。就是说变量“ ^”会去掉重复的依赖文件。

$<

规则的第一个依赖的文件名。如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。

模式规则和自动化变量必须通过示例和实操来理解

只有理论根本没法解决,而且理论相当难记。

  • 示例
  • 实操

makefile中的小技巧

-代表该条命令执行失败了,也会继续向下执行下一条命令


总结:
2022-0226凌晨:先这样 内容比较多总结起来需要时间 已经晚了 明天继续 需要补充的就是实操验证
加强手感 争取提高速度,养成肌肉记忆。

2022-0226下午:基本理论部分内容已经补充完整,只剩下具体的示例和实操(至关重要)
要出门了,剩余的再说吧

你可能感兴趣的:(linux,vim,编辑器)