5233杨光--Linux第二次实验
实验说明
1. 环境登录
无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可
2. 环境使用
完成实验后可以点击桌面上方的“实验截图”保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。 实验记录页面可以在“我的主页”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
3. 课程来源
内容一:vim编辑器的使用
1.vim编辑器的三种模式
Ⅰ正常模式:(按Esc或Ctrl+[进入) 左下角显示文件名或为空
Ⅱ插入模式:(按i键进入) 左下角显示--INSERT--
Ⅲ可视模式:左下角显示—VISUAL
2、vim的一些基本操作
Ⅰ、游标移动:
在进入vim后,按下i键进入插入模式。在该模式下您可以输入文本信息,下面请输入如下三行信息:
12345678
abcdefghijk
shiyanlou.com
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
按键 |
说明 |
h |
左 |
l |
右(小写L) |
j |
下 |
k |
上 |
w |
移动到下一个单词 |
b |
移动到上一个单词 |
请尝试在普通模式下使用方向键移动光标到shiyanlou这几个字母上面
Ⅱ.插入模式
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入
命令 |
说明 |
i |
在当前光标处进行编辑 |
I |
在行首插入 |
A |
在行末插入 |
a |
在光标后插入编辑 |
o |
在当前行后插入一个新行 |
O |
在当前行前插入一个新行 |
cw |
替换从光标所在位置后到一个单词结尾的字符 |
请尝试不同的从普通模式进入插入模式的方法,在最后一行shiyanlou前面加上www.,注意每次要先回到普通模式才能切换成以不同的方式进入插入模式
Ⅲ.保存文档
命令行模式下保存文档:
保存文档从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下
Ⅳ.退出vim
命令行模式下退出vim:
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
以下为其它几种退出方式:
命令 |
说明 |
:q! |
强制退出,不保存 |
:q |
退出 |
:wq! |
强制保存并退出 |
:w <文件路径> |
另存为 |
:saveas 文件路径 |
另存为 |
:x |
保存并退出 |
:wq |
保存并退出 |
Ⅴ.普通模式下退出vim
普通模式下输入Shift+zz即可保存退出vim
Ⅵ.删除文本
1.普通模式下删除vim文本信息
进入普通模式,使用下列命令可以进行文本快速删除:
命令 |
说明 |
x |
删除游标所在的字符 |
X |
删除游标所在前一个字符 |
Delete |
同x |
dd |
删除整行 |
dw |
删除一个单词(不适用中文) |
d$或D |
删除至行尾 |
d^ |
删除至行首 |
dG |
删除到文档结尾处 |
d1G |
删至文档首部 |
除此之外,你还可以在命令之前加上数字,表示一次删除多行,如:
2dd表示一次删除2行
内容二:Linux下C语言编程基础
实验目的
1. 熟悉Linux系统下的开发环境
2. 熟悉vi的基本操作
3. 熟悉gcc编译器的基本原理
4. 熟练使用gcc编译器的常用选项
5 .熟练使用gdb调试技术
6. 熟悉makefile基本原理及语法规范
7. 掌握静态库和动态库的生成
1 Linux命令
如果使用GUI,Linux和Windows没有什么区别。Linux学习应用的一个特点是通过命令行进行使用。
登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着选项
(options)或参数
(arguments)。即Linux中命令格式为:
command [options] [
arguments]
//中括号代表是可选的,即有些命令不需要选项也不需要参数
选项
是调整命令执行行为的开关,选项
不同决定了命令的显示结果不同。
参数
是指命令的作用对象。
如ls命令,ls
或ls .
显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略。我们可以用ls -a .
显示当前目录中的所有内容,包括隐藏文件和目录。其中“-a” 就是选项,改变了显示的内容,如下图所示:
GCC 的使用
一、GCC编译器
gcc 支持编译的一些源文件后缀名
后缀 |
源文件 |
.c |
C语言源文件 |
.C .cc .cxx |
C++源文件 |
.m |
Object-C源文件 |
.i |
经过预处理后的C源文件 |
.ii |
经过预处理后的C++源文件 |
.s .S |
汇编语言源文件 |
.h |
预处理文件(头文件) |
.o |
目标文件 |
.a |
存档文件
|
二、使用GCC的四个步骤
- 预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
- 编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
- 汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
- 链 接:gcc hello.o –o hello ;gcc -o 调用ld三、GCC支持的文件类型
GDB的使用
建议使用CGDB,比GDB好用,熟悉VC的调试方式,可以使用DDD。 注意使用GCC编译时要加“-g”参数。 参考gdb参考卡GDB最基本的命令有
- gdb programm(启动GDB)
- b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
- run 开始运行程序
- bt 打印函数调用堆栈
- p 查看变量值
- c 从当前断点继续运行到下一个断点
- n 单步运行
- s 单步运行
- quit 退出GDB
问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
其他几个我认为应该掌握的调试命令有:
- display 跟踪变量值的改变
- until 跳出循环
- finish 跳出函数
- help 帮助
- gdb常用代码指令
- $gdb
- 这样可以和gdb进行交互了。
- *启动gdb,并且分屏显示源代码:
- $gdb -tui
- 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p.
- *启动gdb调试指定程序app:
- $gdb app
- 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。
- *启动程序之后,再用gdb调试:
- $gdb
- 这里,是程序的可执行文件名,是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
- *启动程序之后,再启动gdb调试:
- $gdb
- 这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。
- **启动gdb之后的交互命令:
- 交互命令支持[Tab]补全。
- *显示帮助信息:
- (gdb) help
- *载入指定的程序:
- (gdb) file app
- 这样在gdb中载入想要调试的可执行程序app。如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。
- *重新运行调试的程序:
- (gdb) run
- 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。
- 参考资料:一、百度百科
- 二、vaqeteart的博客—常用gdb代码大全
make工程管理器
-
makefile是make读入的唯一配置文件
在一个makefile中通常包含如下内容:
-
需要由make工具创建的目标体(target),通常是目标文件或可执行文件。
-
要创建的目标体所依赖的文件(dependency_file);
-
创建每个目标体时需要运行的命令(command),这一行必须以制表符(Tab键)开头。
格式:
target: dependency_files
command make的命令行
命令格式 |
含义 |
-C dir |
读入指定目录下的makefile |
-f file |
读入当前目录下的file文件作为makefile |
-i |
忽略所有的命令执行错误 |
-I dir |
指定被包含的makefile所有目录 |
-n |
只打印要执行的命令,但不执行这些命令 |
-p |
显示make变量数据库和隐含规则 |
-s |
在执行命令时不显示命令 |
-w |
如果make在执行过程中改变目录,则打印当前目录名 |
作业
将实验楼中的代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;
编写makefile,让代码编译,上述静态库和共享库的使用自动化
建立函数静态库cal1.a:
将静态库cal1.a链接到main.o中并生成执行文件cal1并执行
建立函数动态库cal2.so
将静态库cal2.a链接到main.o中并生成执行文件cal2并执行
建立静态库的makefile文件
运行make管理器生成cal3执行文件并执行
建立动态库makefile文件
运行make管理器生成cal4执行文件并执行
遇到的问题
设置断点的问题上还不够明白
编译时刚开始总不成功,后来发现是没有head.h,补上后就没问题了