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,补上后就没问题了
5233杨光--Linux第二次实验的更多相关文章
- 5233杨光--Linux第一次实验
		学习计时:共14小时 读书:2小时 代码:7小时 作业:2小时 博客:3小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ... 
- Linux第二次学习笔记
		#Linux第二次实验(第三周) 学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟练使用gdb调试技术 熟悉makefile ... 
- 20145330《Java程序设计》第二次实验报告
		20145330<Java程序设计>第二次实验报告 实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承多态 3.初步掌握UM ... 
- 20145224&20145238 《信息安全系统设计基础》第二次实验
		20145224&20145238 <信息安全系统设计基础>第二次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ... 
- 20155323刘威良第二次实验   Java面向对象程序设计
		20155323刘威良第二次实验 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 ... 
- 20145240 《Java程序设计》第二次实验报告
		20145240 <Java程序设计>第二次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.12 实验 ... 
- 20145320《Java程序设计》第二次实验报告
		20145320<Java程序设计>第二次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.12 15: ... 
- 《Java程序设计》第二次实验报告
		20145220 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测 ... 
- 高手养成计划基础篇-Linux第二季
		高手养成计划基础篇-Linux第二季 本文来源:i春秋社区-分享你的技术,为安全加点温度 前言 前面我们学习了文件处理命令和文件搜索命令,简单的了解了一下Linux,但是仅仅了解这样还不行,遇 ... 
随机推荐
- OC 知识:Foundation 框架及相关类详尽总结
			本文用来介绍Foundation框架的相关知识,以及Foundation框架所提供类的相关知识总结. 1. 框架介绍 框架是由很多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使开发程序变得更加 ... 
- Ubuntu 18.04安装MongoDB 4.0
			首先,导入包管理的公钥. Ubuntu包管理工具(即dpkg和apt)要求发行商使用GPG密钥签署包,从而确保包的一致性和真实性. sudo apt-key adv --keyserver hkp:/ ... 
- 撩课-Web大前端每天5道面试题-Day6
			1.请说明ECMAScript, JavaScript, Jscript之间的关系? ECMAScript提供脚本语言必须遵守的规则. 细节和准则,是脚本语言的规范. 比如:ES5,ES6就是具体的一 ... 
- 4 django篇
			1.django请求生命周期 wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架 (Flask.Django) 中间件,帮助我们对请求进行校验或在请求 ... 
- 【LG3240】[HNOI2015]实验比较
			题面 洛谷 题解 30pts 爆搜即可. 100pts 题意描述里有一句:"对每张图片\(i\),小\(D\)都最多只记住了某一张质量不比\(i\)差的另一张图片\(K_i\)." ... 
- Keepalived高可用集群
			一.服务介绍 keepalive起初是专为LVS设计的,专门用来监控LVS集群系统红各个服务节点的状态,后来又加入了VRRP的功能,因此不了配合LVS服务外,也可以作为其他服务(nginx,hapro ... 
- C#阻止系统休眠
			阻止系统休眠 using System.Runtime.InteropServices; static class WinSleepCtr { //定义API函数 [DllImport("k ... 
- 树莓派 Zero WH 初使用体验
			12号买了一个树莓派 Zero WH,这个是什么型号呢?其实和树莓派Zero是同一系列的,加上W则表示多了无线Wifi和蓝牙模块,加上H则表示在板子上已经焊接好了2x20的排针. 这个Zero真的很迷 ... 
- C#用Oracle.DataAccess中连接Oracle要注意版本问题!转)
			一般人,不包括全部平时在开发中使用的都是32位的PC机,所以安装的也是Oracle32位的客户端.但是一般服务器都是64位的,安装的也是 64位的Oracle客户端,如果要部署使用Oracle.Dat ... 
- 手动搭建openstack的痛苦经历
			openstack真的是一个十分痛苦的东西,好在有自动部署工具,虽然有自动部署工具可以方便我们部署使用,但是学习的话,第一次最好手动部署,因为手动部署更能我们了解openstack的工作流程和各组建之 ... 
