1嵌入式操作系统适用专业:物联网工程任课教师:兰方鹏联系方式:13453194233E-mail:lfp424@163.comQQ:275392011TaiyuanUniversityofTechnology太原理工大学·计算机科学与技术学院2Linux编程基础Linux开发概述VI编辑器Linux编译器GCC静态库与动态库Linux调试器GDBMakefile文件3Linux开发概述Windows开发方式特点:在电脑上装一个VC或其它集成开发环境编辑程序→编译程序→看结果→有问题→修改程序→调试程序→查看Linux开发方式特点:linux下的程序开发大多通过在本地安装虚拟机、物理机或网络连接到服务器完成。出于效率、远程开发、嵌入式开发的考虑:开发方式大多是在命令行下完成,没有很好的集成开发环境供我们使用。4Linux开发环境概述Linux文件及目录结构无论何种的版本linux,桌面、应用是外衣。文件组织、目录结构才是linux的核心。Linux命令无命令、不linux编辑器、编译器、调试器写程序永远离不开:编辑、编译、调试不同于windows下完善的集成开发环境,linux下以上操作大多是在字符界面下通过各种命令来完成的。5Vi编辑器Linux提供了一系列功能强大的编辑器,如vi和Emacs。vi是linux系统的第一个全屏幕交互式编辑器,从诞生到现在一直得到广大用户青睐。vi有3种工作模式,分别是命令行模式、插入模式、底行模式。6Vi编辑器的三种模式命令行模式:最初进入Vi系统的默认模式,该模式下可以移动光标进行浏览,整行删除,但无法编辑文字。插入模式:只有在该模式下,用户才能进行文字的编辑输入,用户可以使用[ESC]键回到命令行模式。命令行模式下输入字母“i”,即可进入插入模式。底行模式:该模式下,光标位于屏幕底行,用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号。7三种模式的切换命令行模式插入模式:在命令行模式下,用户输入字符“i”,即可进入插入模式。插入模式底行模式:在插入模式下,用户输入字符“:”,即可进入底行模式。插入模式命令行模式:在插入模式下,用户敲入键[ESC],即可返回命令行模式。8文本编辑1.vi文件名2.键入i进入插入模式3.编辑4.键入[ESC]退入到命令行模式5.键入:wq保存退出9yy:复制当前光标所在行[n]yy:n为数字,复制当前光标开始的n行p:粘贴复制的内容到光标所在行dd:删除当前光标所在行[n]dd:删除当前光标所在行开始的n行/name:在光标之后查找名为“name”的字符串?name:在光标之前查找名为“name”的字符串G:光标移动到文件尾(注意是大写)u:取消前一个动作(注意是小写)Vi编辑器命令行模式功能键:10:w保存:q退出vi(系统会提示保存修改):q!强行退出(对修改不做保存):wq保存后退出:w[filename]另存为filename的文件:setnu显示行号:setnonu取消行号Vi编辑器底行模式功能键:vi与cat的区别vi:既能看、又能改cat:只能看、不能改11Linux编译器GCC编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。GNU项目中的一个子项目GCC(GNUCompilerCollection,GNU编译器套装)是一个编译器套装,是GNU计划的关键部分,也是GUN最优秀的软件之一。GCC最初用于编译C语言,随着项目的发展GCC已经成为了能够编译C、C++、Java、Ada、fortran、ObjectC、ObjectC++语言的编译器大家族。12Linux编译器GCC使用GCC编译程序时,编译过程可以被细分为四个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)13文件类型GCC通过后缀来区别输入文件的类别:.c为后缀的文件:C语言源代码文件.a/.so为后缀的文件:由目标文件构成的库文件.C,.cc或.cxx为后缀的文件:C++源代码文件.h为后缀的文件:头文件.i为后缀的文件:已经预处理过的C源代码文件.ii为后缀的文件:已经预处理过的C++源代码文件.o为后缀的文件:编译后的目标文件.s为后缀的文件:汇编语言源代码文件.S为后缀的文件:经过预编译的汇编语言源代码文件14实例:hello.c:#includestdio.hintmain(void){printf(welcomtotheLinux!\n);return0;}编译和运行这段程序:#gcchello.c-ohello#./hello输出:welcomtotheLinux!15GCC的用法:GCC的使用方法格式:gcc[option1]…filenameoption1:编译器所需要的编译选项filename:要编译的文件名命令、选项和源文件之间使用空格分隔一行命令中可以有零个、一个或多个选项文件名可以包含文件的绝对路径,也可以使用相对路径16GCC编译器选项:GCC编译器选项有100多个,大多是我们用不着,以下只介绍最常用、最基本的选项-ofile:指定生成的可执行文件名为file,若省略次选项,系统给出默认文件为a.out-c:只进行预处理、编译,不生成可执行文件。即:编译器只是把.c的源文件生成.o的目标文件。-g:产生调试工具(GNU的GDB)所必要的符号信息,要想对编译出的程序进行调试,必须加入此选项。17GCC编译器选项:-O(Optimize):对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高但是,编译、连接的速度就相应地要慢一些。-O2:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。18GCC编译器选项:-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。C程序中的头文件包含两种情况∶#includeA.h#include“B.h”选项:预处理程序在系统预设的头文件目录(如/usr/include)中搜寻相应的文件选项“”:预处理程序在当前目录中搜寻头文件。-Idirname选项的作用是告诉系统,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。19GCC编译器选项:hello.c:#includemy.hintmain(void){printf(welcomtotheLinux!\n);return0;}my.h:#includestdio.h其中:my.h文件位于/home/workplace/headgcc编译命令为:#gcchello.c–I/home/workplace/head/-ohello例如:20GCC编译器选项:-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。-lfilename:在连接时,装载名字为“libfilename”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。程序hello.c需要用到目录/home/workspace/lib下的一个动态库libkdb5.so,则命令如下:#gcc-llkdb5hello.c-L/home/workspac/lib-ohello21动态库与静态库:程序在链接过程中生成可执行代码程序链接分为两种:静态链接、动态链接静态链接:由链接器在链接时将库的内容加入到可执行程序中静态链接的特点:优点:对运行环境的依赖性较小,具有较好的兼容性缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间库函数有了更新,必须重新编译应用程序22动态库与静态库:动态库链接的含义:连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序动态链接的特点:优点:在需要的时候才会调入对应的资源函数简化程序的升级;有着较小的程序体积实现进程之间的资源共享(避免重复拷贝)缺点:依赖动态库,不能独立运行动态库依赖版本问题严重23动态库与静态库:前面用到的实例hello.c用到了标准库函数stdio.h使用gcchello.c-ohello时,系统默认采用动态链接的方式进行编译程序,若想采用静态编译,加入-static参数以下是分别采用动态编译、静态编译时文件对比:gcchello.c-ohellogcchello.c-static-ohello24动态库与静态库的制作:main.c:#includestdio.h#include“mylib.h”intmain(void){inta=100,b=200,max_num,min_num;max_num=max(a,b);min_num=min(a,b);printf(“max=%d”,max_num);printf(“min=%d”,min_num);return0;}mylib.h:externintmax(int,int);externintmin(int,int);cmplib.c:intmax(int,int){returnxy?x;y}intmin(int,int){returnxy?x;y}25静态库的制作:静态链接库在Liunx中后缀为.a,以lib开头,例如:libcmp.a静态库的制作:#gcc-ccmplib.c-ocmplib.o#arrclibcmplib.acmplib.o静态库的使用:1.库函数、头文件均在当前目录下#gcc-omainmain.clibcmplib.a2.库函数在/opt1、头文件在当/opt2目录下#gcc-omainmain.c-L/opt1-lcmplib-I/opt226动态库的制作:动态链接库在Liunx中后缀为.so动态库的制作:#gcc-sharedcmplib.c-olibcmplib.so动态库的使用方法1:1.库函数、头文件均在当前目录下#gcc-omainmain.clibcmplib.so2.库函数在/opt1、头文件在当/opt2目录下#gcc-omainmain.c-L/opt1–lcmplib-I/opt227动态库的制作:动态库的使用方法1:gcc编译通过,编译时找到了库函数,但运行时出错提示信息:链接时找不到库。解决方法:执行以下操作,把当前目录和其它目录/opt添加到搜索路径#exportLD_LIBRARY_PATH=./:/opt:$LD_LIBRARY_PATH28动态库的制作:动态库的使用方法2:库函数、头文件均在系统路径下#cplibcmplib.so/lib#gccmain.c-omain-lcmplib#./main这时,运行不会出错29动态库的制作:问题思考:静态库也是放在/lib下,这时链接的到底是动态库还是静态库呢?当静态库与动态库重名时,系统会优先链接动态库编译时加入-static选项会使用静态库30GCC编译器选项:-Wall:生成所有警告信息-w:不生成任何警告信息-DMACRO=defn:定义宏MACRO,等效于程序中使用#defineMACRO=defn31Linux调试器GDBGNU工具的调试器是gdb,该调试器是一个交互式工具,工作在字符模式下。GDB是功能强大的调试器,可以完成如下调试任务:设置断点监视程序变量的值程序的单步调试显示/修改变量的值显示/修改寄存器查看程序的堆栈情况远程调试32Linux调试器GDB#inclu