1.vim编辑器
2.gcc编译器
3.静态库的制作
4.动态库的制作
5.gbd调试
vim 是从vi发展过来的一款文本编辑器 命令 : vi a.txt 前提:安装了vim软件 工作模式: 1.命令模式--打开文件之后,默认进入命令模式 2.编辑模式--需要输入一些命令,切换到编辑模式 3.末行模式--在末行模式下可以输入一些命令
命令模式下的操作: 1.光标的移动:h往左、l往右、j往下、k往上、0行首、$行尾、gg当前文本文件的首部、G当前文件的尾部、500G移动到第500行 2.删除操作:x删除光标后面,X删除光标前面,dw删除单词当前光标的后面部分,d0删除当前行光标前面所有,d$/D删除当前行光标后面所有,dd删除当前行,4dd删除当前行(包括当前行)后面4行 3.撤销操作: u ,U反撤销 4.复制粘贴: yy复制,nyy复制多行 p粘贴在当前行的下边/P粘贴到当前行和当前行的下边 5.可视操作:v进入可视模式, 然后用h、j、k、l选需要的内容,y复制选中,p粘贴在光标所在位置的后面但没有换行操作,P粘贴在光标所在位置的前面但没有换行操作,d删除选中 6.查找操作 /hello :从光标位置向下查找,最下后返回到头部 ?hello :从光标位置向上查找,最上后返回到尾部 # :先移动到要查找的单词,在按#就会高亮显示这个单词 遍历 n/N 7.r:替换当前字符 缩进: << 向左 >> 向右 8.查看man文档 移动到该单词 在按 shift + k ,然后自动跳到man文档第一章开始搜索 按 3 + shift + k ,跳到第三章开始搜索 q 退出 ZZ:保存并退出 文本模式: 从命令模式切换到文本模式 a:在光标后面插入字符 A:从当前行的尾部开始输入字符 i:在光标前面插入字符 I:在当前行的行首插入字符 o:在光标所在行的下面新建一行插入内容 O:在光标所在行的上面新建一行插入内容 s:以删除一个字符为代价,插入字符 S:以删除一行字符为代价,插入字符 末行模式下操作: 从命令模式切换到末行模式: :(符号) 操作: 300:直接跳到第300行 s/tom/jack 回车:替换当前行第一个 s为字符串,tom为替换前的内容,jack替换后的内容 s/tom/jack g 回车:替换当前行所有 s为字符串,tom为替换前的内容,jack替换后的内容 %s/tom/jack g 回车:替换文件所有 s为字符串,tom为替换前的内容,jack替换后的内容 !+命令:执行命令 w:保存 q:退出 q!:退出不保存 wq:保存并退出 x:保存退出 水平分屏:sp (文件) 垂直分屏:vsp (文件) ctrl ww:切换屏 wq:保存并退出 wqall:保存并退出所有的 vim打造IDE: 系统级配置文件目录:/etc/vim/vimrc 用户级配置文件目录:~/.vim/vimrc2.gcc编译器
1.编写c程序sum.c 2.对c程序进行编译 预处理器生成.i文件 gcc -E sum.c -o sum.i: -o:表示自定义预编译后的文件名称 编译器生成汇编文件: gcc -S sum.i -o sum.s 汇编器生成二进制文件 gcc -c sum.s -o sum.o 连接器生成可执行文件 gcc sum.o -o app 执行文件: ./app 一步到位: gcc sum.c -o myapp 不加-o会生成名字为a.out文件,本质一样,只是名称不同。 -I 头文件目录:*指定头文件目录 gcc sum.c -I ./include -o myapp -D :*指定宏,通过宏向程序传参数 gcc sum.c -I ./include -o myapp -D DEBUG -O:指定优化 -O0/-O1/-O2/-O3:0不优化,依次更好,3是最高等级,优化最好 -Wall:提示更多警告信息 -g:添加调试信息 -c:只编译子程序3.gbd调试
静态库: 1.命名格式: 1.lib+库的名字+.a 例如:libmytest.a 2.制作步骤: 1.生成对应的.o文件-- -c 2.将生成的.o文件打包,工具 ar rcs +静态库的名字(libMytest.a) +生成的所有的.o文件、 3.nm libMytest.a :就可以查看静态库中有哪些.o文件 3.发布和使用静态库: 1.发布静态库 2.发布头文件 例:对多个.c文件,以及其头文件在include中,制作静态连接库 gcc *.c -c -I ../include ar rcs libMytest.a *.o 在当前目录生成一个libMytest.a静态链接库文件 mv libMytest.a ../lib 移动到连接库目录中 3.使用方式1 1.在main程序中包含库文件的头文件,在程序中直接使用头文件中的函数, 2.编译时 方式1:gcc main.c lib/libMytest.a -o app -I include 方式2:gcc main.c -I include -L lib -l -o app -L:指定静态库的目录 -l:指定库的名字,对于静态库libMytest.a,它的名字是Mytest。 4.优缺点 优点 1.发程序时不要提供对应的库 2.应用程序执行时,库的加载比较快 缺点: 1.库被打包到应用程序中,导致程序的体积很大 2.库发生了改变,需要重新编译程序
动态共享库 1.命名规则: lib+名字+.so 2.制作步骤: 1.生成与位置无关的代码(生成与位置无关的.o文件) gcc -fPIC -c *.c -I include 2.将.o打包成共享库(动态库) gcc -shared -o libMyCalc.so *.o -I include 生成libMyCalc.so 文件 mv libMyCalc.so ../lib 3.发布。 给用户提供头文件夹include 和libMyCalc.so 3.使用动态库: 方式1:gcc main.c lib/libMyCalc.so -o app -I include 方式2:gcc main.c -I include -L ./lib -l MyCalc -o app ldd :查看我们的可执行程序在执行时所有依赖的共享库 ldd app 如果执行时报错找不到共享库,先确认路径问题,如果还有问题 解决方式1:将动态库libMyCalc.so文件放入linux根目录下的lib目录中(实际不能用,容易替换掉系统同名动态库,导致系统崩溃) 解决方式2:配置 LD_LIBRARY_PATR环境变量,配置后会在默认的环境变量之前先搜索这个环境变量的路径,搜索默认的环境变量的路径 打印该环境变量:echo $LD_LIBRARY_PATH 给该变量赋值:export LD_LIBRARY_PATH=./lib export 导入 ./lib这里用的是相对路径,也可以用绝对路径 这种方式终端关闭就失效了,得重新配置环境变量 解决方式3:如果想永久配置就需要把 export LD_LIBRARY_PATH=绝对路径 写入~.bashrc中 *解决方式4: 1.需要找到动态链接库的配置文件--/etc/ld.so.conf sudo vi /etc/ld.so.conf 2.动态库的路径写到配置文件中,将动态链接库的绝对路径写到末尾 /home/itcast/3Day/Calc/lib 3.更新 sudo ldconfig (-v) -v:查看信 4.优缺点: 优点:1.执行程序体积小 2.动态库更新了,不需要重新编译程序,因为函数接口不变 缺点:1.发布时,需要将动态库提供给用户 2.动态库没有被打包到应用程序中,加载速度相对较慢
5.调试 前提条件:可执行文件必须包含调试信息,也就是在生成可执行文件时加上 -g 进入gdb: gdb+要调试的程序 l:查看源代码(默认显示包含main函数的文件) l +要查看的程序的名字:行数 l +要查看的程序的名字:函数名 l:要继续看后面 回车:默认执行上一次从操作 break/b 22(函数名) :在第22行打断点 break/b 文件名:22(函数名) :在第22行打断点 bredk 15 if i==15:条件断点,只能停在循环体内部 info/i break/b :查看断点信息 start:开始执行程序,只执行一步 n:单步调试,一步一步调试 c:继续执行,直到抵达下一个断点 s:进入函数体内部 l:进入函数体后,查看源代码 p 变量:查看变量的值 ptype 变量:查看变量的类型 display 变量:追踪变量的值 set var 变量=值:设置变量的值,当变量为该值时进行调试,一般用于循环中,提前到达所需的条件值 undisplay 变量的编号:停止追踪这个变量 info display:查看追踪变量的编号 u:跳出单步循环体,进入循环后面的函数/退出当前循环 finish:跳出当前排序c文件,回到main.c文件 跳出之前需要把断点去掉,否则只能等待循环执行完毕才能跳出 del/d 断点编号:删除断点 run/r:运行程序,直接停在断点 quit:退出gdb



