首先我们梳理一下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有三个模式:
命令模式
编辑模式
末行模式
如何切换
命令模式------>编辑模式: i a o I A O s S 这些都可以,而且每一个都有特殊的含义
vim常用指令操作:
明日补充
vsp
1.预处理 gcc -E 生成.i文件 作用:展开宏以及头文件 清除无用的条件编译(替换条件编译)、还有一个(忘了 是删除注释、空行、空白
2.编译 gcc -S 生成.s 文件 作用是检查语法规范
3.汇编 gcc -c 生成.o文件 作用是将汇编语言翻译成机器指令 .o是二进制文件
4.链接 gcc 生成最后的可执行文件
常用gcc参数(必记)
-I 用来帮gcc 指定头文件路径 有些时候头文件在某个文件夹目录中 而不是与.c文件在同一个目录中
这时候就需要用到这个参数
-g 生成调试文件
-v 查看编译器版本
-D 编译时指定宏定义 类似在外部做一个全局宏定义
-Wall 把所有的可能的警告信息全部显示出来
-On n是优化等级 n:0-3
-c 把汇编文件转换成二进制文件
静态库与动态库在大工程常常出现,严格来说,他是不属于gcc的内容的,但是gcc 编译常常用到他们。
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。是.a文件
为了加快编译速度
但是目前编译已经很快了,常常用作制作者提供函数功能给他人调用,但是不希望别人看到自己的源码实现。于是制作静态库链接
它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
静态库:适用于对时间要求高,对空间要求不高的程序
动态库:适用于对空间要求高,对时间要求不高的程序
工具:ar
指令: rcs
具体步骤: 有点记不清了(
makefile、Makefile
存在意义:
学完就等于入门makefile
一个规则:(总的来说,makefile的
目标:依赖条件
一个tab的缩进+命令 必须有这个一个tab的缩进,而且必须只能是一个tab的缩进
至于命令就是gcc命令啦(需要多些gcc命令)
两个函数:
通配符函数、或叫百变牌函数(手动滑稽
作用:查找目录下指定类型的文件,并且最终返回一个环境变量
基本语法:
src = $(wildcard ./*.c) # 意义就是找到当前目录的所有.c文件并取出来,然后赋值给#src普通变量
没有具体这个函数的英文翻译 只能通过拼读来记忆他了
作用就是 把文件后缀改成别的格式 单纯更改格式,没做别的其他处理
####### 基本语法
三个参数:
搞定问题:我是谁,从哪里来,到哪里去
参数一 :我是谁:具体的修改文件是什么
$(src)
参数二:从哪里来 (原来是什么文件)
%.c
参数三:到哪里去 (要修改为什么文件)
%.c
需要注意的是:必须用$符号获取环境变量的值
具体示例
obj = $(patsubst %.c,%.o,$(src))
三个自动变量
你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%“字符。”%“的意思是表示一个或多个任意字符。在依赖目标中同样可以使用”%",只是依赖目标中的"%"的取值,取决于其目标。
而不再是用确定的文件、确定的符号去编写你的规则
关于自动化变量可以理解为由 Makefile 自动产生的变量。在模式规则中,规则的目标和依赖的文件名代表了一类的文件。规则的命令是对所有这一类文件的描述。我们在 Makefile 中描述规则时,依赖文件和目标文件是变动的,显然在命令中不能出现具体的文件名称,否则模式规则将失去意义。
表示规则的目标文件名。如果目标是一个文档文件(Linux 中,一般成 .a 文件为文档文件,也成为静态的库文件),
那么它代表这个文档的文件名。在多目标模式规则中,它代表的是触发规则被执行的文件名。
代表的是所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有的库成员(.o 文件)名。
一个文件可重复的出现在目标的依赖中,变量“ ” 只 记 录 它 的 第 一 次 引 用 的 情 况 。 就 是 说 变 量 “ ^”只记录它的第一次引用的情况。就是说变量“ ”只记录它的第一次引用的情况。就是说变量“^”会去掉重复的依赖文件。
规则的第一个依赖的文件名。如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。
只有理论根本没法解决,而且理论相当难记。
-代表该条命令执行失败了,也会继续向下执行下一条命令
如
总结:
2022-0226凌晨:先这样 内容比较多总结起来需要时间 已经晚了 明天继续 需要补充的就是实操验证
加强手感 争取提高速度,养成肌肉记忆。
2022-0226下午:基本理论部分内容已经补充完整,只剩下具体的示例和实操(至关重要)
要出门了,剩余的再说吧