第2章 编程背景
目录1 Linux中的文本编辑器
vim
①简介
vim有3种不同的操作模式,分别是
- 命令模式:用于输入命令
- 插入模式:用于输入和编辑文本。
- 末行模式:用于保存文件并退出。
vim启动时,处于默认的命令模式,在该模式下,大多数键表示特殊命令。移动光标的命令键示例如下:
- h:将光标向左移动一个字符
- l:将光标向右移动一个字符
- j:将光标向下移动一个字符
- k:将光标向上移动一个字符
在X-window中使用vim时,也可以通过箭头键来完成光标的移动。要输入文本进行编辑,用户必须输入i(插入)或a(追加)命令将vim切换到插入模式:
- i:切换到插入模式,插入文本。
- a:切换到插入模式,追加文本。
要退出插入模式,请按ESC键一次或多次。在命令模式下,输入“:”进入末行模式,将文本保存为文件或退出vim:
- :w:写入(保存)文件。
- :q:退出vim。
- :wq:保存并退出。
- :q!:不保存更改,强制退出。
虽然许多Unix用户已经习惯了vim不同的操作模式,但是其他用户可能认为与其他基于图形用户界面(GUI)的编辑器相比,vim使用起来既不自然也不方便。以下类型的编辑器属于通常所说的所见即所得(WYSIWYG)编辑器。在WYSIWYG编辑器中,用户可以输入文本,用箭头键移动光标,和普通的文本输入一样。通常,通过输入一个特殊的meta键,接着输入一个字母键即可创建命令。例如:
- Ctrl+C:中止或退出。
- Ctrl+K:删除行到缓冲区。
- Ctrl+Y:从缓冲区内容中复制或粘贴。
- Ctrl+S:保存已编辑文本等。
②操作过程
-
安装
sudo apt install - y vim
我这里报错,教程上的方法也不行,我猜测应该换源
之前换过一次源,可还是没效果,这次用了中科大源,终于解决了
参考linux虚拟机换源
换源后下载,成功
2 程序开发
(1)程序开发步骤
-
创建源文件
-
用gcc把源文件转换成二进制可执行文件a.out。如:
gcc t1.c t2.c
gcc是一个程序,包含三个主要步骤:
(1)将C源文件转换为汇编代码文件,即将.c文件转为.s文件。
(2)将汇编代码转换为目标代码,即将.s文件转为.o文件。
(3)链接。
- 将.o文件的所有代码段组合成单一代码段。
- 将所有数据段组合成单一数据段。
- 将所有BSS段组合成单一bss段。
- 使用.o文件的重定位信息调整组合指针、数据和bss段的偏移量。
- 用符号表来解析各个.o文件之间的交叉引用。
推荐博客如何在linux(ubantu)操作系统运行c语言文件,介绍了使用自带的文本编辑器和vim两种方式
编译时我又出现了问题,报错说编译失败,找不到stdio.h。又是一波查教程,最后还是换源。这次把清华源也加进去了。
参考博客:fatal error: stdio.h: No such file or directory
换源的时候又遇到另一个报错:E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
最终完美解决!
总的来说步骤如下:
- 找到保存的文件,在该目录下“右键鼠标”,选择“在终端打开”
- 输入“ls”命令看到本目录下有我们的文件“hello.c”,
(如果你想要运行c++文件,那么刚刚在创建文件的时候要选择语言为cpp)
- 使用命令”gcc hello.c -o hello“将c语言文件”hello.c“编译成”hello“的可执行文件,
- 最后用”./hello“运行该文件,可以看到输出结果为”Hello world!“。
(2)静态与动态链接
创建二进制可执行文件的两种方式:静态链接与动态链接
-
静态链接
链接器将所有必要的库函数代码和数据纳入a.out文件中。这使得a.out文件完整、独立,但通常非常大。
-
动态链接
- 减小每个a.out文件大小;
- 许多执行程序在内存中共享相同库函数;
- 修改库函数无需重新编译源文件。
动态链接所用的库称为动态链接库(DLL)。它们在Linux中称为共享库(.so文件)。动态加载(DL)库是指按需加载的共享库,可用作插件和动态加载模块。
(3)可执行文件
虽然默认的二进制可执行文件名为a.out,但实际文件格式可变。其中包括
- 二进制可执行平面文件
- a.out可执行文件
- ELF可执行文件(Linux中默认的二进制可执行文件,更适合动态链接)
(4)程序执行过程
- 读取a.out文件头,以确定所需的总内存大小,包含栈空间大小:
TotalSize = _brk +stackSize
- sh从总大小中分配一个内存区给执行映像
- sh放弃旧映像,开始执行新映像
- 执行从crt0.o开始,调用main()
3 链接库
(1)创建静态链接库
gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out
静态库的构建:
A.编辑库的实现代码和接口声明
B、编译成目标文件
命令:gcc -c calc.c
gcc -c show.c
生成.o文件
C、打包成静态库
命令:ar -r libmath.a calc.o show.o
D、编译并链接静态库
命令:gcc main.c libmath.a
最后生成一个a.out可执行文件
使用命令:./a.out运行程序。
(2)创建动态链接库
gcc -c -fPIC mysum.c
gcc -shared -o libmylib.so mysum.o
gcc t.c -L. -lmylib
export LD_LIBRARY_PATH=./
a.out
网络分享:Linux学习一:创建静态库以及静态库链接,并执行a.out文件
什么是静态库?
1、静态库的本质就是将目标文件打包成一个文件。
2、链接静态库就是将库中被调用的代码复制到调用模块中。
3、静态库的扩展名是.a 例:libxxx.a
4 GDB调试工具
-
创建makefile:
t: t.c gcc -g -o t t.c
-
然后使用EMACS编辑c语言源文件。
-
编译源代码,打开Tools菜单,选择编译或输入
gcc -g -o t t.c
命令 -
启动GDB
-
多窗口GDB:从GDB菜单中,选择Gud->GDB-MI->Display Other Windows
5 C语言相关
- 结构体和指针
- 链表处理
- 树与二叉树