visual interface编辑文本,无排版,也就是记事本。
可执行、输出、删除、查找、替换等众多文本操作。
无菜单,有命令,而且很多。
i:进入到当前位置
I:行首
a:当前之后
A:行末
o:下一行
O:上一行
M:中间行,一共10行,就是5行
esc:进入命令行:q:q!:wq
gg开头、G结尾,数字+G对应行
yy:复制当前行,nyy:复制接下来的n行,p粘贴。
u:撤回,U撤销之前的所有。
dd:删除当前行,ndd:删除n行。
dw:删除此后的,还是这个单词的内容。
hjkl:左下上右
/:查找,例如/return,就是在文本中查找关键字。n向下,N向上
gg=G排版。
sp上下分屏,vsp左右
vsp 路径文件,双屏。cww切换。cw大于小于号,调宽度。
vim -o3 f1,f2,f3,以左右的方式打开3个文件,如果是O就是上下。
gcc和gdb有直接联系。
gcc是编译器。gdb是调试工具。
gcc可以调试各种版本的内容
gdb就是看哪里出了问题
用gcc做好软件,编译后如果有问题,可以用gdb调试.。
当然 gdb不仅仅可以调试C语言,而vim只是一个编译器而已。
之所以和gcc,gdb放一起说,是因为在Linux/Unix上,很多人都用vim来书写C语言的源码。所以这三个联系的纽带就是C语言,分别负责编写,调试,和编译
IDE集成开发工具,即vs、qt合成vi与gcc的功能。
gcc -v,查看编译期版本号
gcc main.c add.c -I./include -o myapp
这里include就是编译头文件。
也就是说,我们把头文件写到一个文件里,然后编译的时候,用-I作为参数,来提供头文件即可。
如果加入了-g,就是表示要调试,这样生成的exe文件就会更大。
然后,用gdb加上新的exe文件,就进入了gdb调试模式
list是查看代码,回车继续查看。
start从main开始第一行开始执行,执行到下一个断点
n是继续执行下一行。重新start就回到第一行了。
continue继续到下一个断点
run直接到断点位置
quit退出gdb模式
如果没有-g,那么以上都不好使
- gcc main.c -o app
- g++ -std=c++11 main.cpp -o app
- gcc main.c add.c -I./include -o myapp
-Wall加入错误
disable,禁用断点
看变量print*(&变量),或者是:p 变量名
-E预处理:包括头文件展开、宏替换、#开头命令的执行,生成.i文件,由预处理器完成
-S编译:将预处理后生成的文件,生成汇编语言,生成.s文件,由编译器完成
-c汇编:将汇编语言变成机器语言,生成.o/.obj(windows)文件,由汇编器完成
-o链接:将目标语言、静态库、动态库,生成可执行文件,由链接器完成
项目开发目录:include、lib、src,src也就是c/cpp文件。
Linux中的动态库叫做:共享库。
共享库.so不调用的时候不运行,只是磁盘里的一个文件。
windows中的操作:【C++】静态库动态库_王向晚的博客-CSDN博客
Linux下,静态库后缀是.a,动态库是.so,与windows一直,.so文件只有在执行时才会调用。
静态库创建命令:ar rcs libmylib.a file1.0
将一系列.o文件打包成库。
共享库命令:gcc -fPIC -c app.c sub.c
PIC表示代码与位置无关。
将众多.c文件生成.o文件
gcc -c就是生成.o文件,不进行最后一步链接
gcc -fpic -c add.c sub.c在src目录中生成.o文件。
静态库是ar命令,ar rcs 静态库名字.a 合体需要的.o文件
例如ar rcs mylib.a add.o sub.o
nm mylib.a用来查看库文件,正常是不能cat出来的,是乱码。
最后写主函数然后进行编译:
gcc main.c -I../include ../lib/mylib.a -o app,至此成功了。
我们ar rcs的步骤就是把其中的库文件打包起来生成库文件,在其中的.c当中,不用进行头文件的书写,只需要把头文件都写在一起就行。
步骤:
共享库有三个文件名:real name、soname、linker name
真正的库文件名字是real,包含完整的库版本号
soname是一个链接名,只顾包含共享库的主版本号,主版本号一直即可保证接口一致,因此,只要soname一致,这个共享库就可以使用。
例如realname是3.6.18,但是soname就是3.6就行。
linkername只在编译链接的时候使用。
共享库生成:
gcc -shared -Wl,-soname,mydll.so.1 -o mydll.so.1.0.1 *.o
首先shared表示是共享库,Wl是参数,soname是.1的,而后跟的是realname,最后是把所有的.o文件合体,生成了一个realname的so文件。再移动到lib中。
共享库加载:
ELF二进制程序,就是Linux的执行程序。
要把共享库添加至缓存管理:修改配置文件、加入共享库路径、测试
ls -l /etc/ld.so.conf
发现是root权限,利用sudo
sudo vi /etc/ld.so.conf
在文件中加入,库所在的路径,我们放入了lib目录中
/home/xxx/linux/lib/lib
sudo ldconfig -v更新配置文件,重新读取
形式是:soname:realname
继续编译:
gcc main.c -I../include ../lib/mylib.a -o app
这里共享库没有更新...可能是我失败了。