嵌入式Linux操作系统实验3
实验三 嵌入式Linux驱动(1)

实验三嵌入式Linux驱动(1)一、【实验目的】1)熟悉嵌入式Linux驱动程序编写框架。
2)了解七段数码管驱动程序的工作原理,熟练掌握该驱动程序在嵌入式开发平台的移植和注册使用。
二、【实验内容】1)学习Linux驱动源代码,分析代码中各个函数模块的功能作用。
2)在宿主机上交叉编译七段数码管驱动程序,然后移植到目标机上。
3)在目标机上注册驱动程序,验证驱动的功能。
三、【实验步骤】1.了解七段数码管工作原理七段数码管是显示数字的电子元件,因为借助七个发光二极管以不同组合来显示数字,所以称为七段数码管(如图1)。
七段数码管分为共阴极和共阳极,共阳极的七段数码管的正极(或者阳极)为八个发光二极管的共有正极,其他接点为独立发光二极管的负极(或者阴极),使用者只需要把正极接电,不同的负极接地就可以控制七段数码管显示不同的数字。
共阴极的七段数码管与共阳极的只是接电的接法相反而已。
图12.开发板七段数码管电路介绍开发板上有四个七段共阴数码管,2个一组,第一组七段数码管使用系统LED_CS2作为其位选使能信号,两个数码管的段选信号分别使用数据总线的D0~D7位和D8~D15位,如图2所示。
图2第二组七段数码管使用系统LED_CS3作为其位选使能信号,两个数码管的段选信号分别使用数据总线的D0~D7位和D8~D15位,如图3所示。
图3分析可知,对七段数码管的操作主要是对其位选和段选信号的控制。
其中位选信号决定显示哪个七段数码管,段选信号决定其显示的字型信息(共阴极七段数码管段选控制信息如表1),这也是驱动程序和硬件关联的主要部分。
表13.七段数码管驱动程序分析1)添加驱动程序所需的头文件和变量:SEG_CS1和SEG_CS2就是上面硬件接口所提及的两组七段数码管的位选使能信号,LED[10]数组中保存的就是在共阴极数码管上面显示0~9的段选信号。
Seg这个结构体用于保存4个数码管即时显示的数字的段选信号。
#include <linux/module.h>#include <linux/kernel.h>#include <asm/io.h>#include <asm/uaccess.h>#include <linux/fs.h>MODULE_LICENSE("GPL");//用于声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时将收到内核被污染(kernel tainted)的警告char LED_MODULE=0;#define DEVICE_NAME "xidian_seg7"#define SEG_CS1 0x10300000#define SEG_CS2 0x10400000static char LED[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; unsigned long *CS1_Address, *CS2_Address;structseg{char LED1_Val;char LED2_Val;char LED3_Val;char LED4_Val;char negative;};2)同时更新所有七段数码管驱动显示函数:CS1_address对应第一组七段数码管的位选信号,该组第一个数码管的段选信号保存在short变量的低8位,该组第二个数码管的段选信号保存在short变量的高8位。
嵌入式操作系统实验指导书

《嵌入式操作系统》实验指导书实验1 Linux编程基础实验序号:1 实验名称:Linux编程基础适用专业:计算机科学与技术、通信工程学时数:4学时一、实验目的1、熟悉Vim的工作模式,熟练使用vim中的常见操作。
2、熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。
3、熟悉多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量的理解。
4、使用autotools生成多文件的makefile,进一步掌握autotools的使用方法。
二、实验内容1、vim使用练习(1)在“/root”目录下建一个名为“vim”的目录。
(2)进入“vim”目录。
(3)将文件“/etc/inittab”复制到“vim”目录下。
(4)使用vim打开“vim”目录下的inittab.(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。
(6)将光标移到该行。
(7)复制该行内容。
(8)将光标移到最后一行行首。
(9)粘贴复制行的内容。
(10)撤销第9步的动作。
(11)将光标移动到最后一行的行尾。
(12)粘贴复制行的内容。
(13)光标移到“si::sysinit:/etc/rc.d/rc.sysinit”。
(14)删除该行。
(15)存盘但不退出。
(16)将光标移到首行。
(17)插入模式下输入“Hello,this is vi world!”.(18)返回命令行模式。
(19)向下查找字符串“0:wait”。
(20)再向上查找字符串“halt”。
(21)强制退出vim,不存盘。
2、用gdb调试程序的bug(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。
此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出,代码如下所示。
#include<stdio.h>int display1(char *string);int display2(char *string);int main(){char string[]=”Embedded Linux”;display1(string);display2(string);}int display1(char *string){printf(“The original string is %s \n”,string);}int display2(char *string1){char *string2;int size,i;size=strlen(string1);string2=(char *)malloc(size+1);for (i=0,i<size;i++){string2[size-i]=string[i];}string2[size+1]=’’;printf(“The string afterward is %s\n”,string2);}(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。
嵌入式linux系统实验指导书0909

《嵌入式Linux系统》课程配套实验实验指导书湖北经济学院电子工程系2009年8月目录实验一Linux 系统安装与简单配置 (3)实验二常用命令使用 (4)实验三 vi编辑器 (6)实验四 shell编程 (11)实验五常用开发工具 (17)实验六 Linux 内核编译实验 (22)实验七建立嵌入式文件系统实验 (30)实验八制作交叉编译器 (35)实验一Linux 系统安装与简单配置(2学时)一、实验目的1.学会在操作系统安装之前,根据硬件配置情况,制订安装计划。
2.掌握多操作系统安装前,利用硬盘分区工具(如PQMagic) 为Linux准备好分区。
3.掌握Linux操作系统的安装步骤。
4.掌握Linux系统的简单配置方法。
5.掌握Linux系统的启动、关闭步骤。
二、实验内容1.安装并使用硬盘分区工具(如PQMagic),为Linux准备好分区。
2.安装Linux系统(如红旗Linux桌面版)。
3.配置Linux系统运行环境。
4.正确地启动、关闭系统。
三、主要实验步骤1.制订安装计划。
2.如果在机器上已安装了Windows系统,没有给Linux预备硬盘分区,则安装硬盘分区工具(如PQMagic),运行它,为Linux划分出一块“未分配”分区。
3.在光驱中放入Linux系统安装盘,启动系统。
按照屏幕提示,选择/输入相关参数,启动安装过程。
4.安装成功后,退出系统,取出安装盘。
重新开机,登录Linux系统。
5.对Linux系统进行配置,包括显示设备、打印机等。
6。
安装软件工具和开发工具(利用工具软件盘和开发软件盘)。
四、说明1.本实验应在教师的授权和指导下进行,不可擅自操作,否则可能造成原有系统被破坏。
2.如条件不允许每个学生亲自安装,可采用分组进行安装或课堂演示安装的方式。
实验二常用命令使用(2学时)一、实验目的1.掌握Linux一般命令格式。
2.掌握有关文件和目录操作的常用命令。
3.掌握有关进程操作的常用命令。
嵌入式实验三报告

实验三一、实验内容:1.熟悉开发板2.学会制作用于安装系统的SD卡等3.配置NFS服务二.步骤1.熟悉开发板结合Tiny4412用户手册第一章的Tiny4412开发板介绍熟悉开发板的构造。
2.准备工作结合Tiny4412用户手册第二章的内容,熟悉开发板的启动模式,设置超级终端,制作SD卡,linux系统烧写,使用minitools工具快速刷系统,使用USB烧写系统,使用MINItools工具烧写系统。
注意:在制作SD卡前,首先参考Tiny4412用户手册第49页,恢复SD卡到原始状态。
然后在开始按照45页的内容制作SD卡。
3.使用minicom操作开发板(串口或U转串模式)4.主机(Windows)、虚拟机(Ubuntu 终端、宿主机)、开发板之间的互ping——Bridged方式1.设置主机IP地址(有线网卡)2.虚拟机(Ubuntu 终端、宿主机)(1)编辑虚拟网络,指定有线网卡(2)设置网络适配器(3) 设置IP地址3. 将开发板连接上主机,测试互ping (1)虚拟机ping主机(Windows)(2)虚拟机ping开发板和主机(3)主机ping虚拟机和开发板(3)开发板ping主机和虚拟机(宿主机)5.配置NFS服务nfs服务,制作根文件系统时才算是真正用上它了,通过它“挂载”制作好的根文件系统。
它在嵌入式中的角色可用下图说明。
用网线将主机与开发板连接起来,主机开启nfs服务后,就可以像tftp一样传文件到开发板了。
NFS服务器安装配置实现Ubuntu 12.04与ARM文件共享实现步骤:1.服务器端:sudo apt-get install portmap2.服务器端:sudo apt-get install nfs-kernel-server3.服务器端配置:sudo gedit /etc/exports添加:/home/share 192.168.1.*(rw,sync,no_root_squash)(共享目录) (允许IP)(rw权限是可擦写,还有ro只读,sync代表数据会同步写入到内存与硬盘中,async则代表数据会先暂存于内存当中,而非直接写入硬盘,开放客户端使用root身份来操作服务器的文件系统,那么开no_root_squash才行,root_squash不允许)4.服务器端启动:sudo /etc/init.d/rpcbind restart5.服务器端启动:sudo /etc/init.d/nfs-kernel-server restart6.arm板连接时:主机:sudo ifconfig eth0 192.168.1.101 netmask 255.255.255.0arm板:ifconfig eth0 192.168.1.102 netmask 255.255.255.07.arm板上mount:mount -t nfs 192.168.1.101:/home/share /mnt/hosts(主机IP和共享目录) (arm板目录)mount上之后arm板上文件自动同步(1.出现问题:reason given by server: Permission denied解决:服务器端启动一定要sudo启动,不然启动失败,服务拒绝2.出现问题:svc: failed to register lockdv1 RPC service (errno 111).lockd_up: makeso、ck failed, error=-111mount: mounting 192.168.1.101:/home/share on /mnt/hosts failed: Connection refused则改成:mount -t nfs -o nolock 192.168.1.101:/home/share /mnt/hosts3.出现问题:mount: mounting 192.168.1.101:/home/share on /mnt/hosts failed: Device or resource busy解决:mount上之后在进行mount命令会出现此提示,设备正在运行,不用再次mount如果想再次mount可以先umount /mnt/hosts)。
嵌入式微处理器实验指导(实验一、二、三、四、五)

实验一、Linux常用命令及工具【实验目的】熟悉Linux常用命令及工具的使用,特别是常用命令的关键选项及用法需要熟悉。
【实验内容】1. 在老师讲解下掌握Linux常用命令和工具的用法;2. 打开虚拟机ubuntu的Terminal,进行命令的练习和熟悉;3. 截图保存相关界面;【实验准备】1. 熟悉Ubuntu虚拟机的安装和使用。
2. 熟悉Linux常用命令和工具。
【实验报告要求】1. 分别叙述Linux常用命令、ctags+vim工具的功能和一般用法,包括常用选项。
2. 需要有实验记录。
【实验步骤】一、常用命令用法:1、对于不熟悉的命令请查看网页:/2、ls的功能及常用选项,当以长格式显示目录下的内容列表时,输出的信息从左到右依次包括文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间、文件名等,对于文件类型和权限模式需要熟悉;3、cd的功能及常用选项:-、/、~、.、..各表示什么意思?4、mkdir、cp、mv、rm、pwd的功能及常用选项;5、chmod的功能及常用选项;6、find的功能及常用选项;7、grep的功能及常用选项;8、tar的功能及常用选项。
二、常用工具的安装和熟悉1、下载ctags-5.8.tar.gz和vim-6.4.tar.bz2文件,复制到虚拟机的root目录下,用tar解压缩,然后安装。
安装方法如下:1)进入源代码根目录执行./configure,2)然后执行make,3)编译成功后执行make install。
2、进入/opt/WXL/wxl210/linux2.6.35wxl210exp20131202路径下,运行命令:ctags –R *然后运行:vi –t WXL_hello_init就能定位到WXL_hello_init函数定义的代码处,熟悉此文档中的代码并理解。
注意Ctrl + ]和Ctrl + T的用法。
3、将vimrc文件复制到虚拟机/root目录下,改名为.vimrc。
《嵌入式操作系统》实验报告

..
..
..
..
..
思考:如何能在 Linux 系统启动时,输出显示自定义的文本信息,请修改 码,完成此功能。
Linux 核启动代
..
..
..
..
..
5. 实验中遇到的问题及解决方法
在 实 验 中 遇 到 一 些 问 题 , 例 如 在 复 制 的 时 候 我 记 得 原 来 用 cp
–
a /tmp/linux-2.4.18-br.tar.gz
} module_init(hello_init);
module_exit(hello_exit);
..
..
..
..
..
有关驱动程序的编写规, 请参考课程教材, 本实验只在编写简单的驱动 ( 核 ) 程序并加入 到 Linux 核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。 编写好 helloworld.c 后将其拷贝到核源码树的 drivers/char/ 目录下。
obj-$(CONFIG_PPDEV)
+= ppdev.o
(4) 、运行 make menuconfig 配置核对 helloworld 程序的支持 :
[rootlocalhost linux-2.6.35.7]# make distclean [rootlocalhost linux-2.6.35.7]# make menuconfig
[rootlocalhost
/]#
cp
/UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/
helloworld.c
(2) 、进入实验核源码目录修改 driver/char/ 添加 helloworld 程序的菜单支持
嵌入式实验报告三

嵌入式实验报告三一、实验目的:1.学习cygwin;2.通过上机实验,使学生验证、巩固和充实所学理论知识,加深对相关内容的理解,了解嵌入式Linux的内核布局,掌握内核配置及编译方法。
二、实验要求:1.安装cygwin及内核源码;2.配置基于S3c2410处理器的内核选项。
3.编译生成zImage。
三、问题:1.简述嵌入式开发中和体系结构相关的内核布局,说明哪些目录是在内核移植中需要重点关注的。
linux内核主要由5个模块构成:进程控制模块,内存管理模块,文件系统模块,进程间通信模块和网络接口模块。
这几个模块的相互关系如下图,虚线和虚线框表示在该版本中还未实现的:可以看到所有的模块都与进程调度有关,它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。
下图是内核结构图:2.简述内核编译的步骤和对应命令的作用,说明zImage、bzImage的异同。
1.安装cygwin安装路径d:\cygwin选择全部安装All2.准备文件复制linux-2.4.18-rmk7-pxa1-mz5.tar --> /tmp/edukit-2410复制\patch --> /tmp/edukit-2410复制cross-armtools-linux-edukit2410.tar --> /tmp安装交叉编译工具&设置系统环境$> cd /tmp/$> tar -P -xvjf cross-armtools-linux-edukit2410.tar.bz2$> ls!- armtools-linux ! !/tmp/$> source armtools-linux/cross-install.sh$> ls /usr!- arm-linux !- !/usr/3.安装内核源码包tar -xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5.tar.bz24.安装内核补丁patch -p1 < /tmp/edukit-2410/patch/kitii.patch 5. 编译生成内核make xconfig或make menuconfig选择合适的配置文件或者自己进行相应的配置Make depMake zImage6. 检测生成的内核镜像是否存在/arch/arm/bootbzImage和zImage的区别来自于保护模式代码的放置位置:1. 众所周知,内核映像包括两部分代码:实模式代码和保护模式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU保护模式,开始执行32位保护模式代码。
嵌入式Linux操作系统实验3资料

实验3-1 Vi使用●实验目的:学会用vi编辑器●实验要求:熟练使用该节所介绍的vi创建、编辑、保存文件●实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台●实验步骤:1. 在当前目录下键入命令vi hello.c创建名为hello.c的文上图是在命令行模式下2. 键入i进入插入模式3. 在插入模式下输入文字hello word!4. 按[Esc]键退出到命令行模式5. 按shift+;键,即:键进入底行模式6. 键入wq保存退出7. 将文件/etc/samba/smb.conf拷贝到当前目录下,下面的实验步骤是为了让大家能够熟练使用vi中的常见操作。
命令:cp /etc/samba/smb.conf ./8. 用vi打开文件smb.conf,设定显示行号,指出“ShareDefinitiongs”的所在行号在底行模式下,输入:set nu显示行号这样就可以看到“Share Definitions”所在的行为246行。
9. 将光标移动到248行命令:248G即在命令行模式下输入248shitf+g10. 复制改行以下6行内容命令:6yy11. 将光标移动到最后一行行首命令:G,即shift+g12. 粘贴复制的内容命令:p13. 删除12步粘贴的6行命令:6dd14. 撤销第13步的操作命令:u15. 查找字符串“Share Definitions”命令:/Share Definitions16. 强制退出vi,不存盘命令::q!17. 总结:对vi编辑的使用必须非常的熟练,因为vi编辑器是非常常用的。
以后编辑程序、查看文档、修改配置文件等操作都会用到,所以大家要多练习。
实验3-2 Gcc程序编译∙实验目的:学会使用gcc编译器及各种常用编译选项的使用理解库设计的功能:1)代码的封装保密 2)代码模块化设计∙实验要求:1、编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-o2等选项2、静态库和动态库的使用∙实验器材:软件:安装了ubunt 12.4的vmware虚拟机硬件:PC机一台∙第1题实验步骤:∙先用vi编辑hello.c文件,内容如下:int sum_int(int a, int b){return a+b;}int main(){int a=2,b=3,c;c=sum_int(a, b);printf(“sum of a and b is %d\n”,c);}gcc指令的一般格式为:gcc [选项] 要编译的文件[选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello命令:#gcc hello.c –o hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将介绍四个流程分别做了什么工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3-1 Vi使用●实验目的:学会用vi编辑器●实验要求:熟练使用该节所介绍的vi创建、编辑、保存文件●实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台●实验步骤:1. 在当前目录下键入命令vi hello.c创建名为hello.c的文上图是在命令行模式下2. 键入i进入插入模式3. 在插入模式下输入文字hello word!4. 按[Esc]键退出到命令行模式5. 按shift+;键,即:键进入底行模式6. 键入wq保存退出7. 将文件/etc/samba/smb.conf拷贝到当前目录下,下面的实验步骤是为了让大家能够熟练使用vi中的常见操作。
命令:cp /etc/samba/smb.conf ./8. 用vi打开文件smb.conf,设定显示行号,指出“ShareDefinitiongs”的所在行号在底行模式下,输入:set nu显示行号这样就可以看到“Share Definitions”所在的行为246行。
9. 将光标移动到248行命令:248G即在命令行模式下输入248shitf+g10. 复制改行以下6行内容命令:6yy11. 将光标移动到最后一行行首命令:G,即shift+g12. 粘贴复制的内容命令:p13. 删除12步粘贴的6行命令:6dd14. 撤销第13步的操作命令:u15. 查找字符串“Share Definitions”命令:/Share Definitions16. 强制退出vi,不存盘命令::q!17. 总结:对vi编辑的使用必须非常的熟练,因为vi编辑器是非常常用的。
以后编辑程序、查看文档、修改配置文件等操作都会用到,所以大家要多练习。
实验3-2 Gcc程序编译∙实验目的:学会使用gcc编译器及各种常用编译选项的使用理解库设计的功能:1)代码的封装保密 2)代码模块化设计∙实验要求:1、编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-o2等选项2、静态库和动态库的使用∙实验器材:软件:安装了ubunt 12.4的vmware虚拟机硬件:PC机一台∙第1题实验步骤:∙先用vi编辑hello.c文件,内容如下:int sum_int(int a, int b){return a+b;}int main(){int a=2,b=3,c;c=sum_int(a, b);printf(“sum of a and b is %d\n”,c);}gcc指令的一般格式为:gcc [选项] 要编译的文件[选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello命令:#gcc hello.c –o hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、链接一步完成,下面将介绍四个流程分别做了什么工作。
–E选项的使用-E选项的作用:只进行预处理,不做其他处理。
例:只对hello.c文件进行预处理,生成文件hello.i,并查看命令:#gcc –E hello.c –o hello.i使用命令#cat hello.i查看hello.i文件的内容可以看到头文件包含部分代码#include <stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
–S选项的使用-S选项的作用:只是编译不汇编,生成汇编代码例:将hello.i文件只进行编译而不进行汇编,生成汇编代码hello.s命令:gcc –S hello.i –o hello.s使用命令#cat hello.s查看hello.s的类容∙–c选项的使用-c选项的作用:只是编译不连接,生成目标文件“.o”例:将汇编代码hello.s只编译不链接生成hello.o文件命令:#gcc –c hello.s –o hello.o使用objdump -d hello.o 命令查看反汇编代码命令:#gcc hello.o –o hell∙–static选项的使用-static选项的作用:链接静态库例:比较hello.c链接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小命令:#gcc hello.c –o hello#gcc hello.c –o static hello1可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的。
∙-g选项的使用-g选项的作用:在可执行程序中包含标准调试信息例:将hello.c编译成包含标准调试信息的可执行文件hello2命令:#gcc –g hello.c –o hello2带有标准调试信息的可执行文件可以使用gdb调试器进行调试,以便找出逻辑错误。
–O2选项的使用-O2选项的作用:完成程序的优化工作。
例:将hello.c是用O2优化选项编译生成可执行文件hello1,和正常编译产生的可执行文件hello进行比较2、实验步骤:1、建立project目录,其子目录结构如下,2、在src文件夹编写main.c主程序,参考代码如下:编译运行,通过,之后做如下调整:1)在include文件夹下新建头文件myhead.h,将main.c程序中,包含头文件语句和函数声明语句删除并添加到myhead.h中。
在src 文件夹下编写sum.c 文件,将main.c程序函数的实现部分移动到,sum.c中。
将myhead.h 包含到 main.c中。
myhead.h的参考代码如下:main.c 的参考代码如下:2)目录结构如下:3)由于头文件myhead.h与mian.c不在用一个目录下,编译时必须加入-I 选项来链接指定目录的头文件,gcc main.c sum.c –o main –I../include/myhead.h4)继续修改代码,将sum.c 制作为静态库sum.a,并将其保存到lib目录中。
并将sum.c源程序剪切到桌面暂时保存。
并且为了实验效果,将lib文件夹下用touch命令创建两个库文件。
目录结构如下:静态库的制作及加载的一般方法如下:gcc sum.c -c -o sum.o -I ../include/----> 先得到*.o的目标文件(可重定位)ar -crs libsum.a add.o ----> 通过ar归档工具,将add.o生成静态库文件库方法(库加载方式):gcc main.c -o main -I ../include -L ../ -lsum -static-静态编译(通过 -static 指定)-----------------------------------静态编译使用的是静态库-----> libxxx.a编译完成后运行main 程序,并尝试将main.c拷贝到其它目录下程序能否正确运行,从而验证链接静态库生成的可执行程序,程序在运行时,不依赖库,因为编译时已经将库中的代码添加到目标文件中了,并且系统默认动态编译而不是静态编译。
分析动态库的优缺点并写到实验报告中:优点:执行时不需要再额外加载,速度快缺点:全部代码被编译进程序,体积大5)动态库的制作及链接方法:将保存的sum.c 制作成动态库gcc sum.c -c -o sum.o -I ../include/----> 先得到*.o的目标文件(可重定位)gcc -shared -fPIC sum.o -o libsum.so----> 生成位置无关的共享库文件并将生成的动态库libsum.so,移动到lib目录中库加载方法:gcc main.c -o main -I ../include -L ../ -lsum生成可执行程序main,程序的运行却要依赖动态库,原因及解决方法如下:程序编译时:需要加载对应的库文件,库文件的位置?/lib /usr/lib如果所需的头文件不在标准头文件目录,则需要通过 -L选项指定 ----> -L 库文件路径-l 指定库文件名称 --> libadd.so --> -ladd动态库文件参与链接------------------------------------------------运行前,必须确保库文件在准确的库文件加载路径中,否则将提示加载失败!!!解决方法:1)将库文件拷贝到标准库路径(/lib /usr/lib )2)确认自定义生成的库文件在自定义目录中,如:/home/gec/project/lib修改环境变量 LD_LIBRARY_PATH ---> 指定路径exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gec/project/lib 如果想长期有效,需要修改系统的配置文件,例如:/etc/bash.bashrc3)修改系统的库文件加载配置文件:/etc/ld.so.conf ----> 在该文件中添加库的新路径(/home/gec/project/lib)使能: ldconfig理解动态库的优缺点:优点:大部分加载的库代码不被编译进程序,只保留调用的信息符号,在执行时再调用,体积小缺点:执行时再额外加载,速度慢;对运行环境中库文件有依赖(必须在执行的环境中有相应的库文件)知识点:1、系统默认动态编译,所谓动态编译,编译器优先链接动态库,只有在链接的动态库不存在的时候才会链接静态库,除非自己指定是静态编译(-static)。
2、动态编译时,没有对应的动态库,只有静态库-------> 系统将静态库链接入程序,影响程序的体积等价于:静态库中的代码,直接加载到当前文件,成为程序的一部分。
实验3-3 GDB程序调试∙实验目的:学会gdb调试器的使用∙实验要求:编写一应用程序,使用gdb调试,调试中使用到该小结所介绍的所有命令∙实验器材:软件:1.安装了Ubunt的vmware虚拟机硬件:PC机一台∙实验步骤:∙先用vi编辑文件test.c用于geb调试器调试,内容如下:∙将test.c文件编程成包含标准调试信息的文件test命令:#gcc –g test.c –o test∙启动gdb进行调试命令:gdb test可以看到gcb的启动界面中显示了gdb的版本、自由软件等信息,然后进入了由“gdb”开头的命令行界面。
∙l(list)命令l命令用于查看文件,如下图:可以看到每行代码前面都有对应的行号,这样方便我们设置断点。
b(breakpoint)命令b用于设置断点,断点调试是调试程序的一个非常重要的手段,设置方法:在“b”命令之后加上对应的行号,如下图:在gdb中可以设置多个断点。