版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,嵌入式系统 第十一章 嵌入式Linux系统的应用程序开发,2,第十一章 Agenda,11.1 Linux 应用程序开发概述 11.2 Vi 的使用 11.3 使用gcc 进行Linux 应用程序开发 11.4 GNU 的make 和makefile 11.5 嵌入式Linux 的GUI,3,11.1 Linux 应用程序开发概述,嵌入式Linux的应用程序开发基本等同于Linux的应用程序开发,除了采用的是交叉编译环境,采用特定于嵌入式系统的开发库(如ulibc库,或者特定的GUI库等),4,嵌入式Linux 应用程序开发,Linux下的应用程序主要有两种特殊的文件: 可执行文件是能够被
2、计算机直接执行的程序,相当于win平台下exe文件。(本章讨论,一般是elf格式) 脚本程序则是一组指令,这些指令将由另外一个程序(一般来说是shell解释器)来执行,相当于dos下的bat文件。(略),5,嵌入式Linux应用程序开发,将被搜索的那些子目录都被保存到一个名字为PATH的shell变量里面,和dos下的情况差不多。PATH是由系统管理员预先配置好了的,通常包括 /bin,/usr/bin,/usr/local/bin 你可以使用echo $PATH来显示。如果你是使用的root登陆系统,则还会多包括以下目录: /sbin,/usr/sbin。,6,嵌入式Linux应用程序开发,
3、可以使用linux操作系统vi/vim编辑器或者emacs编辑器gcc编译和链接器 (我们采用的是这个最原始和有效的方法) 可以使用windows操作系统cgywin编译环境 还可以使用linux操作系统kdeveloper和Kylix等IDE环境,7,第十一章 Agenda,11.1 Linux 应用程序开发概述 11.2 Vi 的使用 11.3 使用gcc 进行Linux 应用程序开发 11.4 GNU 的make 和makefile 11.5 嵌入式Linux 的GUI,8,Vi,Vi 是Linux 系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人
4、们主要使用的文本编辑工具,足以见其生命力之强,而强大的生命力是其强大的功能带来的。 目前,安装Linux之后,一般采用的是vim,它支持c 关键字的不同颜色的显示,9,Vi 的3种模式,Vi 有3 种模式,分别为命令行模式、插入模式及底行模式: (1)命令行模式 用户在用Vi 编辑文件时,最初进入的为命令行模式。在该模式中可以通过上下移动光标进行删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。 (2)插入模式 只有在该模式下,用户才能进行文字编辑输入,用户可以按ESC键回到命令行模式。 (3)底行模式 在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退
5、出操作,也可以设置编辑环境,如寻找字符串、列出行号等。,10,11,Vi,命令模式:可以完成诸如粘贴、拷贝等命令,12,Vi,插入模式:完成程序的编辑,13,Vi,底行模式:比如完成文档底保存,14,Vi 的进入和内容输入,15,命令模式,16,命令模式,17,底行模式,18,Vi举例,为了快速获得对linux平台下应用程序设计的体验,我们首先编写经典的hello world程序。 首先,进入linux的控制台界面。 然后,在某个目录建立一个空的c程序文件,比如利用 touch /home/zhaohui/linuxApp/hello.c命令 然后cd到当前目录,调用vi编辑器对这个空文件进行
6、编辑,输入这个程序的源代码,(利用vi hello.c命令,进入vi编辑器,然后进入vi的编辑状态,然后输入程序,然后进入vi的底行状态,进行源程序的保存和vi的退出,回到shell提示符。),19,Vi举例,-hello.c- #include int main() printf(Hello, Linux programming world!n); return 0; -,20,Vi举例,在当前目录输入编译这个程序的命令,在程序没有错误的情况下,会在当前目录得到一个可执行文件hello。,21,Vi举例,这个命令会依次调用gcc的预编译器(cpp),编译器(生成.s文件),汇编器(生成.o文
7、件)和链接器程序(ld)。,22,Vi举例,当然也可以使用objdump d hello来查看汇编代码。 诸如objdump等这些命令称为binutils,是非常强大的代码分析工具。比如addr2line,ar,as,gprof,ld,nm,objcopy,objdump,ranlib,size,strings,strip等。 具体可以参考其man命令手册。,23,24,补充:头文件和函数库,linux程序开发的头文件 函数库 静态库 共享库,25,头文件和函数库,linux程序开发的头文件 函数库 静态库 共享库,26,1.头文件,一般而言,每个C+/C程序通常由头文件(header fil
8、es)和定义文件(definition files)组成。 头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 C+/C程序的头文件以“.h”为后缀。,27,对c语言来说,头文件一般存在于目录/usr/inlcude下面 而对于linux操作系统的头文件,一般存在于目录/usr/include/sys和/usr/include/linux下。 其他程序设计系统也可能有自己单独的目录,比如/usr/include/X11或者/usr/include/g+等。,头文件,28,Gcc的一个可
9、选参数:I,用于在编译阶段,指定非标准位置的头文件。 比如:gcc I /usr/*/include test.c会在指定的位置查找test.c文件所include的一些头文件。,头文件,29,定义:是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常是一组相互关联的用来完成某项常见工作的函数构成(比如c库里面的标准输入输出函数、时间函数和数学函数等)。 库文件的含义:就是一组处于可以“拿来就用”的状态下的二进制目标代码。当有程序需要用的函数库中的某个函数的时候,就会通过include语句引用对此函数做出声明的头文件。 程序函数库可以使整个程序更加模块化,更容易重新编译
10、,而且更方便升级。,2 函数库,30,编译器和链接程序负责把程序代码和库函数结合在一起成为一个独立的可执行程序。如果使用的不是标准的c语言运行库而是某个扩展库,则必须指定它的位置和名字(使用I,L和l参数)。 在链接阶段,会搜索一些默认的目录,比如/lib和/usr/lib等来查找需要的库文件。,库文件,31,命名规则:一般是以lib打头,然后后面接上表示函数库功能的名字部分。比如libc、libm和libcap等。 类型:分成静态库和共享库,后缀名分别是a和so(一般在系统中的/lib中,两个版本都存在)。而在win平台下面,分别是lib和dll。,库文件,32,在编译程序的时候,为了保证链
11、接的正常进行,可以告诉gcc库文件的位置(当然,标准的c库是不需要指定的,其他的非标准库则要指定)。 Gcc的一个可选参数:L,用于在链接阶段,指定非标准库文件的位置。 比如: $gcc o x11fred L/usr/openwin/lib x11fred.c lX11,库文件,33,静态函数库(static libraries):是一个普通的目标文件的集合,也叫归档文件,一般用“.a”作为文件的后缀,比如libc.a和libX11.a等。 自己建立静态函数库的方法: 编写库函数的时候,尽量把不同类型函数实现编写到不同的源代码文件里面; 然后使用gcc的编译命令对各个文件进行独立编译,从而得
12、到各自的目标文件; 然后使用ar命令把各个目标文件打包在一起。,3. 静态库,34,1)编写一个小函数库,这个函数库里面有两个函数。分别使用两个源代码文件。 2)各自代码如下: fred.c- #include void fred(int arg) printf(fred: you passed %dn, arg); ,静态库:Example,35,bill.c- #include void bill(char *arg) printf(bill: you passed %sn, arg); ,静态库:Example,36,3)进行两个源代码文件的编译 $ gcc c bill.c fred.
13、c $ ls *.o bill.o fred.o,静态库:Example,37,4)利用ar命令,把目标代码添加到一个库文件中去。 $ ar crv libfoo.a bill.o fred.o a bill.o a fred.o,静态库:Example,38,静态库:Example,5)为了让库的使用者可以重复利用库所提供的函数,要编写一个头文件,在其中声明库都是对外提供了哪些函数。如果另外一个程序员打算使用库所提供的服务,则必须在头文件中include这个头文件。,39,静态库:Example,lib.h- /* This is lib.h. It declares the functio
14、ns fred and bill for users */ void bill(char *); void fred(int);,40,静态库:Example,6)编写一个测试程序,使用库中的一个函数。源代码如下: program.c- #include lib.h int main() bill(Hello World); exit(0); ,41,静态库:Example,7)编译和运行 第一个方法- $ gcc c program.c $ gcc o program program.o bill.o 第二个方法- $ gcc o program program.o libfoo.a 第三个
15、方法- $gcc o program program.o L. lfoo $ ./program bill: you passed Hello World $,42,静态库,静态库的优点:使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速度上快一些。 静态库的缺点:如果我们在同一时间运行多个程序,而它们又都使用着来自同一个函数库里的函数时,内存里面就会有许多份同一个函数的拷贝,在程序文件本身里面也有许多份同样的拷贝。这些会造成大量的硬盘和内存空间的浪费。而使用共享库可以解决上面的两个问题。,43,4. 共享库,共享函数库(shared libraries):当一个可执行程序在
16、启动的时候被加载的函数。 每个共享函数库都有个特殊的名字,称作“soname”。soname名字命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最后是版本号信息。 共享库的存放位置和静态库是一样的。比如,你可以利用ls命令显示/lib目录下的库的名字,可能的一个输出是libc.so.6(它是一个软链接文件),它是c语言标准库的共享版本,6代表的是主版本号。,44,共享库特点,如果一个程序使用了共享库,它的链接方式如下: 程序本身不再包括函数的代码,而只保存共享代码的调用线索(references),共享代码是在该程序运行的时候才加入到其中的。 当编译好的程序被加载到内存中准
17、备执行的时候,函数的调用线索被解析(the function references are resolved),程序向共享库发出调用,共享库只在必要的时候才被加载到内存。,45,共享库优点,1. 多进程使用同一函数库:通过这种方法,在内存里,系统就可以只保留一份共享库的拷贝供许多程序使用,在硬盘上也只需要保存一份拷贝就可以了。 2. 修改函数库不需重新连编:共享库的升级不再会影响到依赖于它的那些程序。比如,我们只需要修改从/lib/libc.so.6到实际库文件的升级版本的符号链接就可以了。,46,共享库的安装,安装一个新版本的函数库的时候,要先将这些函数库文件拷贝到一些特定的目录中,运行ld
18、config就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。 例如,创建两个目标文件(a.o和b.o),然后创建一个包含a.o和b.o的共享函数库。,47,共享库的加载,Linux中的加载器:对于linux系统而言,负责加载共享库并解析app程序中的函数调用线索的程序(也就是共享库的动态加载器)是ld.so或者ld-linux.so.2。 查找共享库的其他目录是在/etc/ld.so.conf文件里面配置的;如果这个文件被修改了(比如,系统里面添加了X11共享库),可以使用工具程序ldd来处理(其
19、实就是让ld-linux.so.2重新读取配置文件的内容到内存中)。,48,ldd命令,ldd命令:如果想了解某个程序要求使用的是哪一个共享库,可以使用工具程序ldd来查看。比如: $ ldd program libc.so.6 = /lib/libc.so.6 (0 x4001a000) /lib/ldlinux.so.2 = /lib/ldlinux.so.2 (0 x40000000),49,总结:函数库和头文件的保存位置,函数库 /lib:系统必备共享函数库 /usr/lib:标准共享函数库和静态函数库 /usr/i486-linux-libc5/lib:libc5 兼容性函数库 /u
20、sr/X11R6/lib:X11R6 的函数库 /usr/local/lib:本地函数库 头文件 /usr/include:系统头文件 /usr/local/include:本地头文件,50,51,第十一章 Agenda,11.1 Linux 应用程序开发概述 11.2 Vi 的使用 11.3 使用gcc 进行Linux 应用程序开发 11.4 GNU 的make 和makefile 11.5 嵌入式Linux 的GUI,52,11.3 使用gcc 进行Linux 应用程序开发,11.3.1 gcc 编译器概述 11.3.3 gcc 的使用,53,11.3.1 gcc 编译器概述,gcc 是G
21、NU 的C 和C+ 编译器。实际上,gcc 能够编译多种语言:C、C+ 和Object C、 Fortran、Ada和Pascal等。 利用gcc 命令可同时编译并连接C 和C+ 源程序。也可以对几个C 源文件利用gcc 编译、连接并生成可执行文件。,54,11.3.2 gcc的编译过程,使用gcc,程序员能够对编译过程有更多的控制,编译过程分成四个独立的处理过程:预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking) 可以分别利用相应的参数独立完成 也可以利用一个命令完成4个步骤: gcc killerapp.c helper.
22、c -o killerapp,55,gcc的编译过程,56,gcc的四个阶段,预处理: 首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。 编译: 接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。 汇编: 汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S或.s为后缀的汇编语言源代码文件汇编之后都生成以.o为后缀的目标文件。 连接: 当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,
23、同时,该程序所调用到的库函数也从各自所在的函数库中连到合适的地方。,57,11.3.3 gcc 的使用,gcc的基本语法格式是 gcc options filenames 如 gcc c a.c o a.o 当不用任何选项编译一个程序时,在假定编译成功的情况下,gcc将会建立一个名为a.out的可执行文件。,58,可执行文件格式,Linux系统中可执行文件有两种格式。 第一种格式是a.out格式,这种格式用于早期的Linux系统以及Unix系统的原始格式。a.out来自于Unix C编译程序默认的可执行文件名。当使用共享库时,a.out格式就会发生问题。把a.out格式调整为共享库是一种非常复
24、杂的操作。,59,可执行文件格式,第二种格式是ELF(Executable and Linking Format) 它是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的,已被软件业广泛采用。在Linux系统中ELF格式是其默认的目标文件格式,许多嵌入式软件都采用ELF格式作为目标文件格式。 它最早被引入Unix系统5的第四版本和Solaris系统中。很容易实现共享库。 gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持
25、ELF格式的系统上。,60,Gcc支持的后缀名,61,GNU C 的使用,62,gcc命令行参数,63,gcc命令行参数,64,gcc命令行参数,65,gcc命令行参数,66,第十一章 Agenda,11.1 Linux 应用程序开发概述 11.2 Vi 的使用 11.3 使用gcc 进行Linux 应用程序开发 11.4 GNU 的make 和makefile 11.5 嵌入式Linux 的GUI,67,11.4 GNU 的make 和makefile,11.4.1 GNU Make 概述 11.4.2 make 的工作过程 1.4.3 GNU make 的主要预定义变量,68,make,重
26、要性:什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但要作一个好的和professional的程序员,makefile还是要懂。 好处:makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。,69,1. GNU make,在大型的开发项目中,人们通常利用make 工具来自动完成编译工作。这些工作包括: 如果仅修改了某几个源文件,则只重新编译这几个源文件; 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。 利用这种自动编译可大大简化开
27、发工作,避免不必要的重新编译。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C+的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。,70,GNU make,实际上,make 工具通过一个称为makefile 的文件来完成并自动维护编译工作。 makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖
28、该文件的源文件。 默认情况下,GNU make 工具在当前工作目录按如下顺序搜索makefile: GNUmakefile makefile Makefile,71,GNU make,在UNIX中,习惯使用makefile 作为makefile 文件。 Linux程序员使用第三种文件名Makefile。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。 如果要使用其他文件作为makefile,则可利用类似下面的make 命令选项指定makefile 文件: $ make -f Makefile.debug,72,Make文件示例,Makefile foo.o : foo.c defs
29、.h # foo模块 gcc -c foo.c 程序源代码编写完成后,输入make就可以完成程序的编译,得到foo.o文件。,73,2. Makefile文件的基本结构,74,Makefile文件的基本结构,75,Makefile实例,76,Makefile实例,77,Makefile实例,78,总结:Make的工作过程,79,Example:一个简单的makefile文件,80,3. Makefile中的变量,Makefile里的变量就像一个环境变量。事实上,环境变量在make中也被解释成make的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用
30、如下: (1)保存文件名列表。在前面的例子里,作为依赖文件的一些目标文件名出现在可执行文件的规则中,而在这个规则的命令行里同样包含这些文件并传递给gcc做为命令参数。如果使用一个变量来保存所有的目标文件名,则可以方便地加入新的目标文件而且不易出错。,81,Makefile中的变量,(2)保存可执行命令名,如编译器。在不同的Linux系统中存在着很多相似的编译器系统,这些系统在某些地方会有细微的差别,如果项目被用在一个非gcc的系统里,则必须将所有出现编译器名的地方改成用新的编译器名。但是如果使用一个变量来代替编译器名,那么只需要改变该变量的值。其他所有地方的命令名就都改变了。,82,Makef
31、ile中的变量,(3)保存编译器的参数。在很多源代码编译时,gcc需要很长的参数选项,在很多情况下,所有的编译命令使用一组相同的选项,如果把这组选项使用一个变量代表,那么可以把这个变量放在所有引用编译器的地方。当要改变选项的时候,只需改变一次这个变量的内容即可。,83,变量的定义和使用,84,Makefile变量举例,85,变量的类型,86,GNU make 的主要预定义变量,87,GNU make 的主要预定义变量,88,4. make命令行选项,直接在make 命令的后面键入目标名可建立指定的目标,如果直接运行make,则建立第一个目标。还可以用make -f mymakefile 这样的命令指定make 使用特定的makefile,而不是默认的NUmakefile、makefile或Makefile。 GNU make 命令还有一些其他选项,下面是GNU make 命令的常用命令行选项命令行选项含义:,89,make命令行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中政治青春课件
- 初中政治播报课件
- 初中知识大全课件
- 垂直轴风力发电机课件
- 小学四年级心理健康教育教学设计《角色变变变-换位思考让心靠近》
- 高中英语 教学设计:读后续写叙事推进与语言建构一体化训练
- 小学五年级英语下册Unit 1 My day Part C故事教学设计
- 初中八年级物理教学设计:功率概念建构与计算能力培养
- 初中八年级语文《赤壁》咏史诗三境教学设计与分层练习
- 小学科学三年级下册《速度的测算》核心素养导向的单元化教学设计
- 灯箱维修施工方案
- 读后续写题型讲解课件-高中英语人教版第一册
- 铁路防断培训课件
- 2025年gsp药品批发企业质量风险管理试题及答案
- 药物制剂技术专业教学标准(高等职业教育专科)2025修订
- 泡沫厂生产管理制度
- 《经济法基础》 (第2章) 第一章 总论
- 《海康威视使用说明》课件
- 创新方法大赛理论知识考核试题题库及答案
- 松下-GF2-相机说明书
- 机电样板段配合方案及计划
评论
0/150
提交评论