第8章Linux系统应用程序开发基础.pptx
《第8章Linux系统应用程序开发基础.pptx》由会员分享,可在线阅读,更多相关《第8章Linux系统应用程序开发基础.pptx(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式系统原理与开发教程Linux系统应用程序开发基础主讲人:赖树明东莞理工学院01Linux系统程序设计基础03Linux系统Makefile使用04Linux文件IO编程05课程作业任务02Linux静态库和动态库0101Linux系统程序设计基础Linux程序设计概述GCC 编译器学习Linux系统标准main函数Linux系统程序设计基础 Linux程序设计概述01在Windows系统中,开发工具多以集成开发环境IDE的形式展现给最终用户。例如,VS2019集成了编辑器,宏汇编ml,C/C+编译器cl,资源编译器rc,调试器,文档生成工具,nmake。在Linux系统中,开发工具被切割
2、成一个个独立的小工具,各自处理不同的问题。l编辑器(emacs,vim,gedit)用来进行编辑程序l调试器(gdb)用来调试程序l编译器(GCC)用来编译和链接程序本节重点讲解GCC使用方法,这是踏入Linux编程世界的第一步,要求必须掌握。Linux历史Linux程序设计概述Linux系统程序设计基础 GCC编译器01GNU是一个计划或者叫运动,在GNU计划开发了很多的工作和项目,包括核心的gcc和glibc。Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器
3、相比平均效率要高20%30%。gcc编译器能将C、C+语言源程序、汇程式化序和目标程序编译、连接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别。Linux历史GCC编译器介绍Linux系统程序设计基础 GCC编译器学习01.c为后缀的文件,C语言源代码文件;.a为后缀的文件,是由目标文件构成的档案库文件;.C或.cc或.cxx为后缀的文件,是C+源代码文件;.h为后缀的文件,是程序所包含的头文件;.i为后缀的文件,是已经预处理过的C源代码文件;.ii为后缀的文件,是已经预处理过的C+源代码文件;
4、.m为后缀的文件,是Objective-C源代码文件;.o为后缀的文件,是编译后的目标文件;.s为后缀的文件,是汇编语言源代码文件;.S为后缀的文件,是经过预编译的汇编语言源代码文件。Linux历史GCC支持的文件扩展名Linux系统程序设计基础 GCC编译器学习01C语言从源代码到可执行文件需要经历四个相互关联的步骤,如下所示:GCC编译程序流程预处理(Preprocessing)源代码文件中以#开头的代码进行处理,如#include,#define,#if等),生成不带#开头代码的源中间文件编译(Compilation)把预处理的文件编译生成以.s为后缀的汇编代码文件。汇编(Assembl
5、y)把上一步得到的汇编文件使用汇编器进行编译,生成以.o为后缀的二进制目标文件,但是这时的文件还不能执行。链接(Linking)把所有的.o文件使用链接器进行链接,整合成一个可执行程序。Linux系统程序设计基础 GCC编译器学习01gcc常用选项选项含义-c只编译不链接,源文件编译成目标代码(.o),默认生成目标文件“.o”-S(注意是大写S)生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-o指定输出文件名-O代码优化选项,-ON:指定优化级别,0=N=3,默认为1-v打印出编译内部编译各过程的命令行信息和编译器的版本-Wall打开所有警告-Werror把所有警
6、告当成错误处理-w关闭所有警告-static链接静态库,默认情况下gcc只链接动态库(静态库:以.a为扩展名,动态库:带.so扩展名的库文件)静态链接:生成的可执行程序包含所有调用的函数实现代码动态链接:生成的可执行程序是运行时才在so动态库中搜索其调用的函数的。-I指定编译时包含的头文件路径-L指定链接时第三库文件的路径-l(L的小字字母)指定链接时库文件的名称 在Linux系统中库文件命名 lib库名库名.so*或lib库名库名.a,指定库:-l库名库名 Linux系统程序设计基础 GCC编译器学习01main.c源码清单:#includeexternintadd(int,int);ext
7、ernintsub(int,int);intmain(void)printf(“1+2:%drn,add(1,2);printf(“20-10:%drn,sub(20,10);gcc编译示例add.c源码清单:intadd(inta,intb)returna+b;sub.c源码清单:intsub(inta,intb)returna-b;编译过程:分别编译三个文件为二进制目标文件gcc-Emain.c-omain.igcc-Smain.i-omain.sgcc-cmain.s-omain.ogcc-Eadd.c-oadd.igcc-Sadd.i-oadd.sgcc-cadd.s-oadd.ogc
8、c-Esub.c-osub.igcc-Ssub.i-osub.sgcc-csub.s-osub.o链接:gccmain.osub.oadd.o-omain运行:./maingcc编译器也支持一次编译生成可执行程序,如上面三个c程序,执行以下指令:gcc main.c sub.c add.c-o main 可以直接生成可执行程序main。Linux系统程序设计基础 Linux标准main函数01在Linux系统或Windows系统中,启动应用程序时可以给程序传递参数,例如:“ls-l/home”中,“ls”是程序名,“-l”是参数1,“/home”是参数2,如有更多依次类推。程序要接收启动的参数
9、,由需要通过main函数来完成。示例:以下app-arg.c把命令行中输入的参数数量及每个参数全部输出。app-arg.c源码清单:#includeintmain(intargc,char*argv)inti=0;printf(argc:%drn,argc);for(i=0;iargc;i+)printf(argv%d:%srn,i,argvi);系统级标准main函数说明:uargc记录了启动程序时参数个数,程序名本身算一个参数;uargv是一个char*类型的数组,每个元素保存了命令行为每个字符串参数地址,通过argv的下标可以取得启动程序时传递给程序的参数。编译:$gccapp-arg.
10、c-oapp-arg运行测试:$./app-argc:4argv0:./app-argargv1:xydargv2:123argv3:结果分析:以空格分隔的,每个字符串是一个参数,分别保存在argv数组中。0202Linux静态库和动态库静态库和动态库相关编译选项静态库的创建及使动态库的创建及使动态库与静态库的比较Linux静态库和动态库概述02函数库是能提供一系列功能函数给第三方程序调用的文件,可分为静态库和动态库(也称为共享库),在使用上对应静态链接和动态链接。编译链接程序时,链接器会根据命令选项采用动态库还是静态库中的函数。函数库定义动态库命名:lib.so.y.zlib:固定名称前缀;
11、so:固定后缀y:次版本号;z:发行版本号,其中.y.z是可选的静态库命名:lib.a库命名规则把功能函数写到单独的C文件中,使用编译器封装成.a文件,第三方程序要调用其中的函数时通过编译选项-static-l库名 形式把调用的函数对应代码复制一份到当前程序中,运行时候就再依赖静态库文件。静态库使用原理把功能函数写到单独的C文件中,使用编译器封装成lib.so.y.z动态库文件,第三方程序要调用其中的函数时通过编译选项 -l库名 形式来找到库,记录函数符号,并没有复制代码到当前程序中,而是运行时才加载动态库文件到,找到函数执行。动态库使用原理Linux静态库和动态库静态库和动态库相关编译选项0
12、2如果gcc编译命令中指定该选项,表示代码中使用到来自第三方库的函数必须存在静态库,不能是动态库,否则链接失败。-static选项如果gcc编译指令中指定该选项,表示优先使用动态库链接,即代码中使用来自第三方库的函数,如果同时存在动态库和静态库,会优先使用动态库链接,如果只存在静态库,才会使用静态库文件链接。-shared选项如果gcc编译指令中指定该选项,表示要生成相对地址位置无关的目标代码,通常使用gcc的-shared选项把生成位置无关目标文件编译成动态库文件。-fPIC选项在使用第三方库时,如果没有把第三方库文件复制到系统存放库文件的标准路径中,则要在编译阶段使用-L选项来指定第三方库
13、的存放位置。而-I后面跟着的是库文件存放路径,后面可以加空格,也可以不加空格直接写库文件路径,路径可以是相对路径,也可以使用绝对路径。-L选项链 接 时,采 用 链 接 名 为 libname.a静 态 库 或libname.so动态库的库文件或其中的一个。若两个库文件都存在,则根据编译时指定的选项(-static或-shared或不写)来进行链接。-lname选项aad.c :aad.c :intadd(inta,intb)intc;c=a+b;returnc;Linux静态库和动态库03编写功能函数静态库的创建及使用sub.c :sub.c :intsub(inta,intb)intc;c
14、=a-b;returnc;aad.h :aad.h :#ifndef_ADD_H_#define_ADD_H_intadd(inta,intb);#endifsub.h :sub.h :#ifndef_SUB_H_#define_SUB_H_intsub(inta,intb);#endif gcc-c add.c-o add.o gcc-c add.c-o add.o gcc-c sub.c-o sub.o gcc-c sub.c-o sub.o编译函数为.o文件 ar-crsv libfunction.a add.o sub.o ar-crsv libfunction.a add.o sub
15、.o把.o文件封装成.a执执行行上上面面命命令令后后会会生生成成libfunction.alibfunction.a静静态态库库文文件件,后后面面就就可可以以供供第第三三方方程程序使用。序使用。main.c:main.c:#include#include#includeadd.h/#includeadd.h/引入函数声明引入函数声明#includesub.h#includesub.h/引入函数声明引入函数声明intmain(void)intmain(void)printf(2+1=%d;rn2-1=%drn,add(2,1),sub(2,1);printf(2+1=%d;rn2-1=%drn,
16、add(2,1),sub(2,1);return0;return0;Linux静态库和动态库03测试代码编写静态库的创建及使用工程文件存放结构 include include add.h add.h sub.h sub.h src src add.c add.c libfunction.a main.c main.c sub.c sub.c说明:编译为说明:编译为.a.a 文件后,可以把文件后,可以把add.cadd.c、sub.csub.c删除,我们只需要删除,我们只需要.a.a文件即可。文件即可。编译:编译:gcc-o main main.c gcc-o main main.c libfu
17、nction.a-I./include/-I./include/-这种是把库当成源文件一样使用或者:或者:gcc-o main main.c-I./include gcc-o main main.c-I./include-L./-lfunction -这种是标准的使用方法编编译译生生成成mainmain可可执执行行程程序序后后可可以以删删除除.a.a文文件件,不不会会影影响响到到后后面面可可执执行行程程序序的的运运行行,因因为它已复制一份代码到其中。为它已复制一份代码到其中。运行:运行:./main./mainaad.c :aad.c :intadd(inta,intb)intc;c=a+b;
18、returnc;Linux静态库和动态库03编写功能函数态库的创建及使用sub.c :sub.c :intsub(inta,intb)intc;c=a-b;returnc;aad.h :aad.h :#ifndef_ADD_H_#define_ADD_H_intadd(inta,intb);#endifsub.h :sub.h :#ifndef_SUB_H_#define_SUB_H_intsub(inta,intb);#endif gcc-fPIC-c add.c gcc-fPIC-c add.c-o add.o-o add.o gcc gcc-fPIC -fPIC -c sub.c-o s
19、ub.o-c sub.c-o sub.o编译函数为.o文件gcc-o libfunction.so-shared add.o sub.ogcc-o libfunction.so-shared add.o sub.o把.o文件封装成.a执执行行上上面面命命令令后后会会生生成成libfunction.so libfunction.so 动动态态库库文文件件,后面就可以供第三方程序使用。,后面就可以供第三方程序使用。补充:也支持把上三条指令合并成为条:补充:也支持把上三条指令合并成为条:gcc-o libfunction.so-shared gcc-o libfunction.so-shared-f
20、PIC add.c sub.c add.c sub.cmain.c:main.c:#include#include#includeadd.h/#includeadd.h/引入函数声明引入函数声明#includesub.h#includesub.h/引入函数声明引入函数声明intmain(void)intmain(void)printf(2+1=%d;rn2-1=%drn,add(2,1),sub(2,1);printf(2+1=%d;rn2-1=%drn,add(2,1),sub(2,1);return0;return0;Linux静态库和动态库03测试代码编写态库的创建及使用工程文件存放结构
21、 include include add.h add.h sub.h sub.h src src add.c add.c libfunction.so main.c main.c sub.c sub.c说明:编译为说明:编译为.so.so 文件后,可以把文件后,可以把 add.cadd.c、sub.csub.c删除,我们只需要删除,我们只需要 .so so 文件即可。文件即可。编译:编译:gcc-o main main.c gcc-o main main.c libfunction.so-I./include/-I./include/-这种是把库当成源文件一样使用或者:或者:gcc-o mai
22、n main.c-I./include gcc-o main main.c-I./include-L./-lfunction -这种是标准的使用方法编编译译生生成成mainmain可可执执行行程程序序后后可可以以删删除除.a.a文文件件,不不会会影影响响到到后后面面可可执执行行程程序序的的运运行行,因因为它已复制一份代码到其中。为它已复制一份代码到其中。运行:运行:./main./mainLinux静态库和动态库03运行测试程序态库的创建及使用由由于于采采用用动动态态库库,生生成成mainmain可可执执行行程程序序在在链链接接时时并并没没有有把把调调用用的的add,subadd,sub函函数
23、数实实现现代代码码复复制制到到程程序序当当中中,而而在在运运行行时时候候在在系系统统库库环环境境变变量量中中指指定定的的路路径径去去搜搜索索动动态态库库文文件件,加加载载到到内内在在中中,然然后后再再调调用用已已经经加加载载到到内内在在的的soso文文件件中中的的函函数数代代码码,因因此此,要要想想正正确确运运行行使使用用了了动动态态库库的的程程序序,必必须须把把依依赖赖的的动动态态库库也也复复制制到到系系统统的的环环境境变变量量指指定定的的目目标标当当中中,一一般般可可以以复复制制到到/lib/lib目目录录即即可可,当当然然其其他他系系统统环环境境变变量量指定的库存放目录也是可以的。指定的
24、库存放目录也是可以的。复制动态库文件到复制动态库文件到/lib /lib 目录中:目录中:sudo cp libfunction.a/lib/sudo cp libfunction.a/lib/运行测试程序:运行测试程序:./main./main 补补充充:如如果果不不复复制制到到系系统统环环境境变变量量指指定定的的库库路路径径,也也可可以以通通过过临临时时导导出出环环境境变变量量的的方方式式,不不过过不不推推荐荐使用这种,每次都需要操作一次,比较麻烦:使用这种,每次都需要操作一次,比较麻烦:exportLD_LIBRARY_PATH=$PWDexportLD_LIBRARY_PATH=$PW
25、D。另一种方法:修改另一种方法:修改/etc/ld.so.conf/etc/ld.so.conf配置文件配置文件,把动态库文件所在路径写到其中,然后,把动态库文件所在路径写到其中,然后 执行执行“sudoldconfig”“sudoldconfig”命令让系统重新加载命令让系统重新加载/etc/ld.so.conf/etc/ld.so.conf配置文件可,系统会到指定路径加载动态库配置文件可,系统会到指定路径加载动态库。0303Linux系统Makefile使用Makefile概述Makefile语法Makefile编程进阶少量代码可以直接使用:gcc源代码列表-o可执行程序名命令直接编译,如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第8章 Linux系统应用程序开发基础 Linux 系统 应用程序 开发 基础
限制150内