将近日学习Linux基础编程,系统编程,网络编程的word笔记搬运过来,图片无法直接粘贴,就丢失掉了。
日后工作学习中使用与扩充维护还是word笔记。
基础编程day02
内容简介:
学习目标:
1 掌握vim命令模式下相关命令的使用
2 从命令模式切换到编辑模式
3 末行模式
4 gcc工作流程掌握常见参数的使用
5 linux下静态库的制作和使用
6 linux下动态库的制作和使用
内容简介:
软件的安装
在线,软件包,源码安装
vim命令模式编辑模式末行模式
vim命令模式
3dd,u,dG,p,yy,/查找,K,i编辑模式,ctrl+v可视模式
vim末行模式
sp,vsp,ctrl+w+w,vim –o2,vsp 文件名
~/.vimrc与/etc/vim/.vimrc
gcc工作流程与常用参数
ESc,仅汇编,-I,-L,-l,-o
静态库的制作与使用
lib.XXX.a,-c生成.o,ar rcs打包,-L-l掐头去尾
动态库的制作与使用
libXXX.so,fpic生成.o,gcc –shared打包,无法使用:1环境变量2文件列表3函数
零碎知识点
ls -r逐层展示当前文件夹中的内容
rm dir/* -r 删除dir中的内容,不包括dir
拷贝test中的内容到bk,不包括test
创建软连接的注意事项:
ln–s 文件名 软连接的名字
-s必须要加
文件名使用绝-对路径,即使移动后该软连接依然可以使用
-n显示到这一行
压缩与解压缩
软件的安装和卸载
在线安装--(ubuntu apt-get)
安装:sudo apt-get(apt,仅Ubuntu支持)install 安装包的名字
卸载:sudo apt-get(apt) remove 软件的名字
软件列表的更新:sudoapt-get(apt) update 更新的是官方提供的软件的链接
清空缓存:sudo apt-get(apt) clean
/var/cache/apt/archives这个目录下的压缩包都被删除
软件包安装(ubuntu下 deb格式)
安装:sudo dpkg–i 文件名
卸载:sudo dpkg–r 软件的名字
源码安装:
libevent,在网络编程day05中介绍
YouComplpop就使用源码安装
在libevent下看README,有说明
1 vim需要自己安装
操作系统自带vi,但是功能比较弱,vim是vi的增强版,需要自己去安装
可将vim设置为默认的打开文本的应用程序
2 vimtutor教程
vim相关
vim的三种工作模式
a命令模式:可以对文件做修改
b编辑模式:可以对文件做修改
c末行模式:查询替换保存退出
vim文件名默认就是进入命令模式
vim命令模式下相关的操作:
保存退出:ZZ(不会创建新文件)
代码格式化:gg=G
光标的移动:
HJKL 小键盘0移动到行首 $移动到行末
gg移动到文件头部 G移动到文件的尾部
200G快速定位到200行
200回车,当前行增加200
删除字符
X:前面的
x:后面的
dw:删除一个单词,光标需要在单词的开始位置
d0:删除光标前面的
D/d&:删除光标后面的
dd:删除光标所在行,其实是剪切
3dd:删除光标所在位置后3行
dG:删除光标所在到最后一行数据
撤销和反撤销:
撤销:u
反撤销:ctrl+r
复制:
dd:删除的一行其实是剪切
yy:复制一行
nyy:复制n行
p:粘贴到光标的下面(小写)
P:粘贴到光标的上面
可视模式:
v ctrl+v进入可视模式
可视模式下复制或删除:y/d
粘贴:
p粘贴到光标的后面
P:粘贴到光标的前面
替换操作(insert):
r:替换一个,光标盖住的那个
R:替换多个,从光标盖住的这个往后替换
查找:
/关键字从当前位置向下搜索
?关键字 从当前位置向上搜索
n向下切换,N向下切换
#查找光标所在位置的单词
查看man文档
K查看光标所在位置单词的man文档
不同的函数在不同的章节,shell命令可能会覆盖库中的函数,这时加上章节号
3K,从第三章开始查找
man 3 printf 从第三章开始找printf
man man中前三章要看,第五章了解即可
man 2 系统调用函数 / man 3库调用函数
命令模式切换到编辑模式
a:从光标后面开始插入 A:从行尾插入
i:从光标前面开始插入 I从行首插入
o:在光标所在位置下一行插入 O:光标上创建新行
s:牺牲光标后面的字符 S牺牲一行
按两次esc肯定切换到了命令模式
vim末行模式:
命令模式进入末行模式 “:”
:200跳转到第200行
:wq保存退出
:q!退出不保存
:w保存不退出
:x ==wq
替换操作:
:/s/old/new
:/s/old/new/g把当前行的全部替换 g
:/s/old/new/gc 添加确认 c
:22,28s/old/new替换22-28行之间的所有old为new
:%s/old/new把所有行的old换为new %是所有行
分屏
:sp 水平分屏
:vsp 垂直分屏
ctrl+w+w: 屏幕间切换(window)
:qall: 关闭所有
:wall: 保存所有
:wqall: 保存关闭所有
:sp/vsp 文件名 分屏显示打开当前目录下的其他文件
打开文件时就是分屏
vim –o2 hello.c stdio.h 2要和后面的文件数量对应,也可以省略
-O是垂直分屏
在vim中执行shell命令:
:!shell命令 再按回车键回到vim中的命令模式
vim配置文件
用户级别的:仅对当前用户生效
~/.vimrc 后面经常使用,安装插件等
系统级别的:对所有用户生效,公用同一个配置文件
/etc/vim/vimrc
优先使用用户级别的配置文件。
gcc相关
1 gcc的工作流程 Esc
1预处理:-E
宏替换
头文件展开
注释去掉
xxx.c-> xxx.i
xxx.i还是c文件
2编译:-S 花费时间最多
xxx.i-> xxx.s
汇编文件
3汇编:-c
xxx.s-> xxx.o
二进制文件(库,二进制的源码,保密)
4链接
xxx.o-> xxx(可执行)
gcc调用cpp进行预处理
gcc自己完成编译
gcc调用as完成汇编
gcc调用ld进行链接
gcchello.c –o hello 不加名字,默认生成a.out
2 gcc常用参数
-v/--version:查看版本
-I:编译的时候指定头文件的路径(大写)
gcc sum.c–I ./include/ -o sum 在当前目录下的include文件夹内查找
-c:将汇编文件生成二进制.o文件,还是源代码(制作库)
-o:指定文件的名称
-g:gdb调试的时候需要加
release模式和debug模式的区别,release模式打断点是不会停止的
-D:在编译的时候指定一个宏
使用场景:测试程序时,-DDEBUG这个宏会在预处理时加入
-Wall:显示警告信息
-On:优化代码,n是优化级别:1,2,3
静态库和动态库的制作和使用
1 库是什么
二进制文件
将源代码à二进制格式的源代码
加密,别人只能用(生成可执行文件),不知道写的是什么
2 库制作出来之后,如何给用户使用
头文件(说明书)
制作出的库
3 静态库的制作和使用
命名规则:libtest.a
lib
xxx:库的名字
.a
3.1制作步骤:
原材料:源代码.c .cpp 一般放在src目录中
1 将.c文件生成.o
gcca.c b.c –c
2 将.o文件打包成静态库
ar rcs 静态库的名字原材料
ar- archive ar rcs libtest.a a.o b.o
3 nm查看静态库中的内容
3.2库的使用:
gccmain.c –i ./include/ -L ./lib –l ./test-o app (test为库的名字)
-I:要保证头文件
-L:指定静态库的路径
-l:指定库的名字(掐头去尾)
-o:指定生成的可执行程序的名字
lib a静态(a…); dll so 动态(so?)
4 动态库的制作和使用 .so.1.7版本
命名规则
libxxx.so
制作步骤
1将源文件生成.o
gcc a.c b.c –c –fpic(FPIC)
2打包
gcc–shared –o libxxx.so a.o b.o
库的使用
1头文件a.h
2动态库libtest.so
3参考头文件编写测试程序main.c
gccmain.c –I ./include/ -L ./ -l test –o app
库的搜索顺序
linux下可执行程序格式是elf,搜索动态库顺序 elf内某段à环境变量—>etc/ld.so.cacheàusr/lib如果将.so添加到lib中,有可能与原有的lib重名,覆盖,使系统无法正常工作
动态库无法使用
1使用环境变量
临时设置,仅本次打开的本终端有效
export LD_LIBRARY_PATH = 动态库的路径:$LD_LIBRARY_PATH
不覆盖原有的值,将新值拼接在后面
永久设置
用户级别,仅对当前用户有效
~/.bashrc
配置完成,重启终端,因为终端只在启动的时候读一次这个配置文件
source~/.bashrc 指令可强制加载一次
系统级别,对所有用户有效
/etc/profile
source/etc/profile,强制加载一次,否则需要重启
2 etc/ld.so.cache文件列表
找到一个配置文件
/etc/ld.so.cnf
把动态库的绝对路径加入文件中
执行一个命令
sudoldconfig –v
3 dlopen,dlclose,dlsym
env看所有的环境变量,是键值对,echo$PATH查看PATH环境变量的值,$是取值的意思,路径有很多,相邻之间:间隔
ldd app; 查看app运行时需要链接哪些动态库
file f1 ; 可以查看f1文件的属性