文章目录

一、linux命令

关于前后台任务切换:

  1. ​bg % + 任务号​
  2. ​fg % + 任务号​
  3. ​jobs​​ :查看后台运行的进程
  4. linux基本命令以及库文件_静态库

批量结束进程:​pkill + 进程名​

linux基本命令以及库文件_linux_02


监测系统运行状态:​top​

linux基本命令以及库文件_vim_03


vim常用配置:

linux基本命令以及库文件_linux_04


将文件打包或解包:​tar + 参数 + 文件名​

linux基本命令以及库文件_共享库_05


linux基本命令以及库文件_运维_06


解压并拆包

linux基本命令以及库文件_运维_07

将文件压缩或解压

压缩: ​​gzip + 包名​​​ 解压: ​​gzip -d + 包名​

linux基本命令以及库文件_vim_08

二、gcc

linux基本命令以及库文件_linux_09


linux基本命令以及库文件_vim_10

​main.c​

linux基本命令以及库文件_linux_11


预处理

linux基本命令以及库文件_运维_12

linux基本命令以及库文件_共享库_13


​gcc -E main.c -o main.i​​ :生成预编译文件,进行头文件引入以及宏替换,同时清理注释​​main.i​

linux基本命令以及库文件_linux_14


编译

编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编文件,这个给过程往往是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。

​gcc -S main.i -o main.s​​:编译文件,生成汇编代码

linux基本命令以及库文件_静态库_15


汇编

linux基本命令以及库文件_vim_16

​gcc -c main.s -o main.o​​:汇编,生成机器指令

linux基本命令以及库文件_运维_17


链接

此时生成的​​main.o​​​只占可执行程序​​main​​​的一部分,还需要再链接别的库,分配符号虚拟地址。多个​​.o​​文件整合,合并各个段。

​gcc main.o -o main​​:链接其他文件,生成最后的可执行文件

linux基本命令以及库文件_静态库_18

三、使用makefile文件进行管理

​main.c​

linux基本命令以及库文件_静态库_19


​foo.h​

linux基本命令以及库文件_静态库_20

安装make:​apt install make​

编写makefile文件

linux基本命令以及库文件_linux_21

make执行

linux基本命令以及库文件_运维_22


清理文件

linux基本命令以及库文件_静态库_23


修改​​add.c​​后进行make

linux基本命令以及库文件_linux_24

四、使用gdb调试程序

linux基本命令以及库文件_静态库_25

  1. ​l​​(list) :显示代码
  2. ​b + 行号/函数名​​(breakpoint):在指定位置加断点
  3. ​delete + 断点号​​:删除指定断点
  4. ​enable + 断点号​​:将断点设定为无效的,不加断点号,将所有断点设置为无效
  5. ​r​​(run):运行程序
  6. ​n​​(next):下一步
  7. ​c​​(continue):直接执行到下一个断点
  8. ​s​​ :进入将要被调用的函数中执行
  9. ​finish​​ :跳出当前函数
  10. ​p + 变量名​​(print):打印变量值
  11. ​回车​​:重复上一行命令
  12. ​q​​:退出调试,中止进程
  13. ​info break​​:显示断点信息
  14. ​bt​​:显示函数调用栈

linux基本命令以及库文件_vim_26

五、库文件

什么是库文件?

库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:​​/lib​​​ 和 ​​/usr/lib​​​。在 64 位的系统上有些库也可能被存储在​​/usr/lib64​​​ 下。库的​​头文件​​​一般会被存储在​​/usr/include​​ 下或其子目录下。

库有两种,一种是静态库,其命令规则为 ​​libxxx.a​​​ ,一种是共享库,其命令规则为 ​​libxxx.so​

​foo.h​

linux基本命令以及库文件_静态库_27

​add.c​

linux基本命令以及库文件_linux_28


​max.c​

linux基本命令以及库文件_linux_29


​main.c​

linux基本命令以及库文件_linux_30


第一步:先将需要生成库文件的所有​​.c​​文件编译成​​.o​​文件

linux基本命令以及库文件_vim_31


第二步:使用 ar 命令将第一步编译的所有​​.o​​文件生成静态库( 后面不能跟.c文件 ),其中:

  • c 是创建库
  • r 是将方法添加到库中
  • v 显示过程
  • linux基本命令以及库文件_vim_32

非标准方法执行:

linux基本命令以及库文件_静态库_33

标准使用静态库的方法:

使用静态库​​libfoo.a​​​和​​main.c​​​生成可执行文件的过程,其中​​-L​​​ 指定库的存储路径,​​-l​​​ 指定库的名称(不需要前面的​​lib​​​和扩展名​​.a​​)

linux基本命令以及库文件_共享库_34


下面将双引号​​"foo.h"​​​改成尖括号​​<foo.h>​

1​mv foo.h /usr/include​

2 修改​​main.c​

linux基本命令以及库文件_linux_35


3 运行程序

linux基本命令以及库文件_运维_36


除了C/C++的标准库外,如果需要链接别的库文件,需要使用-l参数手动连接4 将库文件​​libfoo.a​​​移动到默认的库目录​​/usr/lib​

linux基本命令以及库文件_linux_37


使用共享库首先使用​​-shared -fPIC​​​将二进制​​.o​​文件制作成动态库

linux基本命令以及库文件_linux_38


​-fPIC​​作用于编译阶段,告诉编译器产生与位置无关的代码,则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

使用​​ldd​​​可以发现​​main​​​程序找不到动态库,原因是系统加载共享库时,找不到对应的共享库文件​​libfoo.so​​, 但是该库确实在当前目录下存在 (只是gcc知道库在当前目录,但是main程序不知道)

这是为什么呢?因为系统默认只会去存储库的标准位置(​​/lib​​​ 或​​/usr/lib​​​ 等)加载,而不会在当前位置寻找。所以将库拷贝到​​/usr/lib​​ 下,再执行程序,就可以成功。

使用​​ldd​​​可以查看可执行程序使用了哪些​​.so共享库​

linux基本命令以及库文件_静态库_39


可以看到,在​​Ubuntu​​上,​​/lib​​ 和 ​​usr/lib​​实际上是一个目录

linux基本命令以及库文件_共享库_40


如果只是临时设置一下查找共享库的位置,可以通过​​export LD_LIBRARY_PATH=路径​​ 进行设置

linux基本命令以及库文件_vim_41

静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做标记,在运行程序时,才动态加载。

linux基本命令以及库文件_运维_42

如果不使用​​.so共享库​​​,只使用​​.o静态库​​​,当可执行文件特别多的时候,内存中会存在很多函数的拷贝。因为所有的可执行程序都包含了所需要的函数,这使得内存的利用率太低,所以大多数时候使用​​.so共享库​