作者介绍
张伟伟,男,西安工程大学电子信息学院,2019级硕士研究生,张宏伟人工智能课题组。
微信公众号:可随时查阅,搜索—张二牛的笔记,内容会分类上传。
研究方向:机器视觉与人工智能。
电子邮件:2430290933@qq.com
电子邮件:zhangweiweicpp@163.com
- 课题组CSDN官方账号,欢迎一键三连: https://blog.csdn.net/m0_37758063/article/details/113527955?spm=1001.2014.3001.5501.
- 掌握vim命令模式下相关命令的使用
- 掌握从命令模式切换到编辑模式的相关命令
- 掌握vim末行模式下相关命令的使用
- 能够说出gcc的工作流程和掌握常见参数的使用(makefile)
- 熟练掌握Linux下的静态库的制作和使用(重点)
- 熟练掌握Linux下的共享库的制作和使用(重点)
1.1 vim的三种模式
刚进入是命令模式,shell是命令行界面
命令行模式下:
自己常用的命令先记录如下(详细的解释在下面可以学习到)
o 下一行 O 上一行
gg / G 文件首部
0 行首 shift + $ 行尾
ctrl inset 跨终端复制
shift insert 跨终端粘贴
yy 复制当前行
p 粘贴
h j k l 左 上 下 右 的移动
u 撤销
ctrl + r 反撤销
1.2 编辑模式下光标的移动
1.3 vim下的删除
1.4 vim中的撤销与反撤销
1.5 vim中的复制与粘贴
一、选中多行:
使用命令vim打开文件,移动光标至所选行的开头,按v进入视图,键盘上按向下键,选中所需行即可。
二、复制与粘贴
三种方法:
1)在上文第一部分的基础上,按y,然后移动光标至所需粘贴处,按p即可
2)移动光标至所选行的开头,在命令模式下,输入nyy即可,n为从当前行开始,你所要复制的行数
3)用鼠标选中想复制的内容,按下ctrl+insert复制,然后,shit+insert粘贴
1.6 查找和替换
命令行模式下:
1.7 vim文本输入模式下的指令
小o
大O
按列输入
1.8 vim末行模式下的命令(已熟悉)
x相当于wq
1.9 vim的快速翻屏
1.10 vim的配置文件
用户级别的配置文件
~/.vimrc
系统级别的配置文件
/etc/vim/vimrc
2. gcc的工作流程(继续熟悉)
2.1 gcc的工作流程:gcc将源文件生成一个可执行程序,总共四个步骤:预处理(-E)->编译(-S)->汇编(-C)->链接
1.预处理:头文件展开,宏替换,去掉注释**
gcc -E test.c -o test.i
2.编译:编译成汇编语言
gcc -S test.i -o test.s
3.汇编,将汇编变成二进制 (一步操作,内部也执行了ES)
gcc -c test.s -o test.o
4.链接器
gcc -o test test.o
3 .静态库和动态库的制作和使用
3.1 库的介绍
库是二进制文件, 是源代码文件的另一种表现形式, 是加了密的源代码; 是一些功能相近或者是相似的函数的集合体
使用或者调用库的好处:
提高代码的可重用性,而且可以提高程序的健壮性。
缩短开发周期。
库可分为静态库(static library).lib(windows) .a (linux)和共享库(shared library) --.dll(windows) .so(linux)
3.2 静态库的制作与使用
libtest.a
步骤1:将c源文件生成对应的.o文件
gcc -c fun1.c fun2.c
或者分别生成.o文件:
gcc -c fun1.c -o fun1.o
gcc -c fun2.c -o fun2.o
步骤2:使用打包工具ar将准备好的.o文件打包为.a文件
在使用ar工具是时候需要添加参数rcs
r更新、c创建、s建立索引
命令:ar rcs 静态库名 .o文件
ar rcs libtest1.a fun1.o fun2.
------------------------------------------------
3. 使用(在同一目录下)(示例:假设测试文件为main.c
静态库文件为libtest1.a, 头文件为head.h)
gcc -o main1 main.c -I./ -L./ -ltest1
-I: 指定main.c文件用到的头文件head.h所在的路径
-L:指定要连接的库的所在目录
-l:指定链接时需要的静态库, 去掉前缀和后缀
3.3 动态库(共享库)—nm test.so 看库函数表
动态库(共享库)的制作
1.生成目标文件.o, 此时要加编译选项:-fPIC(fpic)
gcc -fpic -c fun1.c fun2.c
2.生成共享库, 此时要加链接器选项: -shared(指定生成动态链接库)
gcc -shared fun1.o fun2.o -o libtest2.so
ldd 查看冬天库
file 查看文件类型
==动态库需要:由ld-linux.so*来完成链接,
1.将其放到环境变量中
对于elf格式的可执行程序,是由ld-linux.so*来完成的, 它先后搜索elf文件的 DT_RPATH段 — 环境变量LD_LIBRARY_PATH — /etc/ld.so.cache文件列表 — /lib/, /usr/lib目录找到库文件后将其载入内存。== (放到上面任何一个环境变量路径中都可以,然后使用下列红色字体环境变量路径)
2 添加并激活
推荐并掌握红色字体的即可:
3.4 共享库的特点:
动态库把对一些库函数的链接载入推迟到程序运行的时期。
可以实现进程之间的资源共享。(因此动态库也称为共享库)
将一些程序升级变得简单。
甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)
3.5 比较动态库和静态库的优缺点
-
静态库的优点:
-
1执行速度快,是因为静态库已经编译到可执行文件内部了
-
2.移植方便,不依赖其他的库文件
缺点:
1.耗费内存,是由于每一个静态库的可执行程序都会加载一次
2.部署更新麻烦,由于静态库修改以后所有的调用这个静态库的可执行文件都需要重新编译。 -
动态库的优点:
1.节省内存
2.部署升级方便,只需替换动态库即可,然后重启服务。
缺点:
1.加载速度比静态库慢
2.移植性差,需要把所欲用到的动态库都移植。
4.作业
1 复习当天内容, 重点是gcc和库的制作和使用
2 编写4个.c文件, 加, 减, 乘, 除
add.c --加法
sub.c --减法
mul.c --乘法
dive.c --除法
main.c —主函数所在文件, 内部调用上述函数
head.h —函数声明
libsmath.a --静态库文件
libdmath.so --动态库文件
main1—静态库可执行程序
main2–动态库可执行程序
5.简介的笔记
gcc的工作流程:
1 预处理: cpp预处理器, 去掉注释, 展开头文件, 宏替换
gcc -E test.c -o test.i
2 编译: gcc, 将源代码文件编译成汇编语言代码
gcc -S test.i -o test.s
3 汇编: as, 将汇编语言代码编译成了二进制文件(目标代码)
gcc -c test.s -o test.o
4 链接: ld, 链接test.c代码中调用的库函数
gcc -o test test.o
静态库的制作:
1 将.c文件编译成.o文件
gcc -c fun1.c fun2.c
2 使用ar命令将.o文件打包成.a文件
ar rcs libtest1.a fun1.o fun2.o
静态库的使用:
1 main.c与head.h和libtest1.a在同一级目录的情况
gcc -o main1 main.c -I./ -L./ -ltest1
2 main.c与head.h和libtest1.a在不同一级目录的情况
gcc -o main1 main.c -I./include -L./lib -ltest1
动态库的制作:
1 将.c文件编译成.o文件
gcc -fpic -c fun1.c fun2.c
2 使用gcc将.o文件编译成库文件
gcc -shared fun1.o fun2.o -o libtest2.so
动态库的使用:
gcc -o main2 main.c -I./include -L./lib -ltest2
动态库文件在编译的时候, 连接器需要使用参数-L找到库文件所在的路径;
在执行的时候, 是加载器ldd根据动态库的路径进行加载的, 与编译的时候用的-L
指定的路径无关.
最常用的解决办法:将LD_LIBRARY_PATH环境变量加到用户级别的配置文件~/.bashrc中,
然后生效(. ~/.bashrc source ~/.bashrc 退出终端然后再登录)