第4章嵌入式Linux程序设计基础课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第4章嵌入式Linux程序设计基础课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux 程序设计 基础 课件
- 资源描述:
-
1、LOGO本章要点 1、嵌入式Linux编译器GCC 2、“文件包含”处理 3、make命令和Makefile文件 4、使用 autotools系列工具 5、位运算 单击此处编辑母版副标题样式LOGO4.1 嵌入式Linux编译器 Linux下C语言编译过程 GCC编译器LOGOLinux下C语言编译过程 Linux下的C语言程序设计与在其他环境中的C程序设计一样,主要涉及编辑器、编译链接器、调试器及项目管理工具。(1)编辑器.Linux下的编辑器就如Windows下的记事本、写字板等一样,完成对所录入文字的编辑功能。Linux中最常用的编辑器有vi(vim)和emacs,LOGO(2)编译链接
2、器。编译是指源代码转化生成可执行代码的过程,它所完成的主要工作如图所示。编译过程是非常复杂的,它包括词法、语法和语义的分析、中间代码的生成和优化、符号表的管理和出错处理等。在Linux中,最常用的编译器是gcc编译器。(3)调试器调试器并不是代码执行的必备工具,而是专为方便程序员调试程序而用的。gdb是绝大多数Linux开发人员所使用的调试器,它可以方便地设置断点、单步跟踪等。(4)项目管理器。Linux中的项目管理器“make”有些类似于Windows中Visual c+里的“工程”,它是一种控制编译或者重复编译软件的工具,另外,它还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集
3、中在代码的编写上而不是在源代码的组织上。LOGOGCC编译器 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作之一。gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%30%。GCC编译器能将C、C+语言源程序、汇编程序编译、链接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。LOGOGCC编译器 使用GCC编译程序时,编译过程可以被细分为四个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Asse
4、mbling)链接(Linking)LOGOGCC编译器 gcc通过后缀来区别输入文件的类别:.c为后缀的文件:C语言源代码文件 .a为后缀的文件:是由目标文件构成的库文件 .C,.cc或.cxx 为后缀的文件:是C+源代码文件 .h为后缀的文件:头文件 .i 为后缀的文件:是已经预处理过的C源代码文件 .ii为后缀的文件:是已经预处理过的C+源代码文件 .o为后缀的文件:是编译后的目标文件 .s为后缀的文件:是汇编语言源代码文件 .S为后缀的文件:是经过预编译的汇编语言源代码文件。LOGO起步(演示)hello.c:#include int main(void)printf(Hello wo
5、rld!n);return 0;编译和运行这段程序:#gcc hello.c-o hello#./hello 输出:Hello world!LOGOGcc的基本用法和选项 Gcc最基本的用法 gcc options filenames -c:只编译,不连接成为可执行文件。-o output_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。-g:产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,产生的可执行文
6、件的执行效率较高。-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。LOGO编译选项(optimize.c)#include int main(void)double counter;double result;double temp;for(counter=0;counter 2000.0*2000.0*2000.0/20.0+2020;counter+=(5-1)/4)temp=counter/1979;result=counter;printf(Result is%lfn,result);return 0;LOGO 1.gcc optimize.c-o optimizet
7、ime./optimize 2.gcc O optimize.c-o optimizetime./optimize 对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善LOGO -static:静态链接库文件 例:gcc static hello.c-o hello 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a。当使用静态库时,连接器找出程序所需的函数,然后将它们拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样,动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入
8、这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库。演示:静态链接与动态链接可执行文件大小比较LOGO-Wall:生成所有警告信息-w:不生成任何警告信息LOGO4.2“文件包含”处理 1、头文件 在C语言中,需要利用头文件来定义结构、常量以及声明函数的原型。大多数C的头文件都存放在/usr/include及其子目录下。引用以上目录中的头文件在编译的时候无需加上路径,但如果程序中引用了其他路径的头文件,需要在编译的时候用 I 参数。LOGO4.2“文件包含”处理-Idirname:将dirname所指出的目录加入到程序头文件目录列表中。C程序中的头文件包含两种情况#in
9、clude#include“B.h”对于,预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于”,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。例:gcc foo.c-I/home/include-o fooLOGO -lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。例:gcc foo.c-L/home/lib-lfoo-o fooLOGO 2、“
10、文件包含”处理“文件包含”处理,意思是把另外一个源文件的内容包含到本程序中来。其作用是减少编写程序的重复劳动,即把一些要重复使用的东西,编写到一个“头文件”(*.h)中,然后在程序中用 include命令来实现“文件包含”的操作。LOGO 例如:n=1+2+3+100 求和运算。1#include 2int main()3int x=100,s=0,i=1;5while(i=x)6s=s+i;7i+;8 9printf(sum=%dn,s);10 return 0;11LOGO 为了让加法部分能重复使用,将加法部分写成一个函数int sum(int n)。int mysum(int n)int
11、 i=1,ss=0;while(i=n)ss=ss+i;i+;return(ss);LOGO 再在主函数中调用它 1#include 2int mysum(int n);3int main()4 5int x=100;6int s=0;7s=mysum(x);8printf(sum=%dn,s);9return 0;10LOGO 注意:上述程序中的第2行语句 int mysum(int n);是必不可少的。由于mysum(int n)函数的定义是从第11行语句开始,而调用mysum(int n)函数的语句在第7行。因此,要在调用之前声明这个函数。下面进一步将程序中具有独立功能的mysum()函
12、数分割出来。该程序可分割为下列3个程序:mysum.h、mysum.c和ex_sum.c。LOGO(1)程序mysum.h:1 /*mysum.h */2 int mysum(int n);(2)程序mysum.c:1./*mysum.c */2.int mysum(int n)3.4.int i=1,ss=0;5.while(i=n)6.ss=ss+i;7.i+;8.9.return(ss);10.LOGO 主程序ex_sum.c:1./*ex_sum.c */2.#include 3.#include mysum.h 4.int main()5.6.int x=100;7.int s=0;
13、8.s=mysum(x);9.printf(sum=%dn,s);10.return 0;11.LOGO 在Linux环境下,执行编译程序命令:gcc ex_sum.c mysum.c -o sum 此命令将ex_sum.c和 mysum.c编译成一个在Linux环境下的可执行文件sum。在Linux环境下运行可执行文件sum,./sum 结果如下:sum=5050LOGO4.3Make命令和Makefile工程管理 Linux程序员必须学会使用GNU make来构建和管理自己的软件工程。GNU 的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。make在执行时,需要一个命名为
14、Makefile的文件。Makefile文件描述了整个工程的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。LOGO Makefile 是 一个配置文件。Makefile 中通常包含如下内容:用于说明如何生成一个或多个目标文件规则 需要由make 工具创建的目标体,通常是目标文件或可执行文件;要创建的目标体所依赖的文件;创建每个目标体时需要运行的命令。LOGO Makefile的格式为:targets:prerequisitescommand 目标依赖命令main.o:main.cgcc c mai
15、n.c 目标?依赖?命令?*命令需要以【TAB】键开始*LOGO认识Make 编写一个Makefile文件如下:sum:ex_sum.o mysum.o gcc ex_sum.o mysum.o-o sum ex_sum.o:ex_sum.cgcc-c ex_sum.c mysum.o:mysum.c mysum.hgcc-c mysum.cLOGO 注意,“gcc ex_sum.c mysum.c-o sum”前面不是空格,而是按下“tab”键的符号位。我们将其保存为:makefile,文件名没有后缀。然后,在Linux环境下执行make,其运行结果如下:#make gcc-c ex_sum
16、.c gcc-c mysum.c gcc ex_sum.o mysum.o-o sum 将ex_sum.c和 mysum.c编译成在Linux环境下的可执行文件sum。LOGO 在Makefile 中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。LOGO伪目标 Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)。.PHONY:cleanclean
展开阅读全文