一、cmd命令

只记重点

1.文件类型

2.软连接和硬链接

硬链接:ln <name1> <name2>

相当于引用吧,所有硬链接的文件的Inode都一样,每次创建一次硬链接硬链接计数加一,每次删除硬链接计数减一,不会影响其他硬链接文件。当硬链接计数为0的时候,Inode被释放,资料彻底被删除。

软链接:ln -s <path> <name>

软连接链接相当于快捷方式,内部存放的是目标文件的路径,访问时根据存放的路径打开材料,创建的时候需要输入绝对路径,否则更换路径可能无法关联到目标文件导致无法打开。

3.所有者和执行权限

文字设定法

chmod <用户>+<权限> 文件名

数字设定法

chmod <u的权限和><g的权限和><o的权限和>

sudo adduser 创建新用户

sw <name>切换用户

sudo chown <新用户名> <filename>修改所有权限

sudo chown<username>:<groupname> <filename>一次性修改用户和组的权限

sudo addgrp <group name>创建用户组

sudo chgrp <new group name> <filename>修改文件用户组所有权限

4.查找文件

find <directory> -name/type <type/name>

-type 按文件类型搜索

-name 按文件名称搜索

-size 按文件大小搜索

-maxdepth n 搜索的递归层数

-exec命令 {} \; 将find搜索的结果集执行某一命令(直接映射全部结果集)

-ok 命令 {} \; 将find搜索的结果集执行某一命令并询问

| xagrs 指令 搭配管道+xargs使用(分片映射结果集)

5.查找文件内容

grep -r '<name>' <dir>

6.查看进程

ps(可交互进程)

ps aux(全部进程)

ps aux | grep 'name' (搜索相关进程)

将ps aux搜索的结果集 使用管道 | 交给grep

7.软件包安装

sudo apt update(本地软件列表与源列表同步)

sudo apt install (安装软件)

sudo apt remove(卸载软件)

sudo dpkg -i <debname>(使用deb包安装软件)

sudo dpkg -r <debname>(删除包)

sudo aptitude show 《软件名》 查看当前系统是否安装某种文档

8.压缩包

tar压缩

tar zcvf <压缩包名.tar.gz> <压缩材料>多文件打包(使用gzip压缩打包)

tar jcvf <压缩包名.tar.gz> <压缩材料>多文件打包(使用bzip2压缩打包)

gzip <文件名>只能压缩一个文件 无法多文件打包

gunzip <压缩文件名> 解压缩

file <filename>查看文件详细属性

tar zxvf 《压缩包名.tar.gz》解压缩

tar jxvf 《压缩包名.tar.gz》解压缩

rar压缩

rar a -r 《名字.rar》 《压缩文件名》压缩

unrar x 《名字.rar》解压缩

ZIP压缩

zip -r 《名字.zip》 《压缩文件名》 压缩

unzip 《名字.zip》 解压缩

9.其他常用的指令

ifconfig 查看网卡信息

man 辅助手册

clear 清屏(ctrl+L)

alias 给组合操控起别名

9.Vim

基础管理见pdf。

二、gcc编译

三、静态库和动态库

静态库:随代码一起编译进可执行文件中,会占用空间,但是调用库中接口速度更快,对空间要求低,对时间要求告。

调用的时候慢。对时间要求低,对空间要求高。就是动态库:计算机只有一份共享的动态库,代码应用的时候访问共享的动态库,不会占用可执行文件的空间,可

1.静态库制作

使用gcc -c完成预处理,编译,汇编,生成二进制.o文件

运用ar rcs lib<name>.a <内容> 制作.a静态库文件

编译制作的静态库到可执行文件中

gcc .c文件 .a资料 -o 生成的可执行文件名

这时会出现警告,说库中的函数未声明

编译器做隐式声明。

可能会出现

通过添加包含调用接口声明的头文件解除警告。

2.动态库制作(重点)

只有当调用动态库中接口的时候,才会去申请访问动态库内存。

动态库函数地址绑定时间比自己函数绑定时间晚,称为延迟绑定。

只有当调用到的时候才会去绑定环境中加载的动态库中函数的位置。

(1)生成与位置无关的二进制代码(因为需用到的时候再绑定地址)

gcc -c name.c -o name.o -fPIC

(2)使用.o二进制文件制作动态库

gcc -shared lib<name>.so <1>.o <2>.o...

(3)编译

gcc name.c -o name.out -l <库名,不带lib和.so> -L 库路径 -I 头文件路径

(4)链接器和动态链接器

指在生成可执行文件的链接阶段时候的库和头文件的链接就是链接器

-l -L -I

不告诉系统库文件的路径将会出现无法编译的情况。就是而动态链接器则是执行阶段的链接,若

解决方式:

当前终端进程结束后失效。(常用)就是a.临时应用 export LD_LIBRARY_PATH=库目录 让当前进程的库路径临时生效,但

b.直接修改.bashrc启动项,添加永久路径 export LD_LIBRARY_PATH=库目录(常用)

值得注意的是

使用绝对路径、加:$LD_LIBRARY_PATH 防止影响其他动态库的展开(LD_LIBRARY_PATH为一个列表,包含多个库的路径)

c.将动态库资料拷贝到标准C库的lib文件夹中,因为每次执行可执行文件系统都会区标准c库下的lib文件中去检索标准库的动态库材料。

d.部署ld.so.conf材料,将动态库的绝对路径写入配置文件中,并使之生效。

补充:数据段合并、地址回填

对重名、可合并的数据符号进行合并,减少内存空间的占用。

地址回填

开始各个函数的地址是相对于main函数的地址,当main的地址确定后进行地址回填。

四、gdb调试

生成可执行文件的时候应用 -g参数

gdb. a.out 开始调试

list n:列出从n开始源码

b:设置断点

r:运行程序

n:下一条指令(越过函数)

s/step:下一条指令(步进函数)

p i:查看i变量的值

c:继续执行断点后指令

q:退出调试

f/finish:步出,返回到调用点上

set args .. .. .. :设置命令行参数

run .. .. .. :执行时设置命令行参数

info b:查看断点信息

b n行 if ...:设置条件断点

ptype i:查看变量类型

bt:列出当前程序存活的栈帧对应的编号

frame n:切换到编号位n的栈帧

display:设置跟踪变量

undisplay:取消设置跟踪变量,使用编号

栈帧补充:程序运行的过程中,函数调用会在栈区域申请一片内存存放韩式调用过程中使用的变量。每个栈帧只能存放函数中使用到或者被声明的变量,而无法存放其他栈帧的变量。

当函数调用结束后栈帧被归还。

五、makefile

命名:makefile、Makefile

规则:

目标:依赖条件(当前目录直接写,子目录写相对路径)

(一个tab缩进)命令

make 目标生成目标对象

ALL:指定makefile的终极目标

当一个记录修改时,直接执行连串编译可能导致违背修改的资料重新编译从而浪费资源,因而先分开汇编二进制资料,最后拿二进制文件进行执行文件的生成。

值得注意的是,头文件的声明只在编译阶段需要声明(.c--->.o),而链接阶段(.o--->.out)不需要声明头文件。

两个函数:

src = $(wildcard ./*.c):匹配当前工作目录下所有.c文档并将文件名组成列表赋值给src。

obj = $(patsubst %.c %.o $(src))将第三参数列表下的.c转换为.o并赋值给obj

$符号用于引用定义的宏变量。

关于clean

再makefile文件中加入clean后可以执行 make clean来执行清除中间文件的指令

注:- 强制执行

make file -n拟执行,列出清理列表防止删错。

最终的makefile文件如下图