《嵌入式Linux 应用程序开发教程03-Linux下的C编程基础.ppt》由会员分享,可在线阅读,更多相关《嵌入式Linux 应用程序开发教程03-Linux下的C编程基础.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程三 Linux下的下的C编程基础编程基础第三章 Linux 下的C 编程基础v本章目标熟悉Linux 系统下开发环境熟悉gcc 编译器基本原理熟练使用gcc 编译器常用选项熟练使用gdb 调试技术熟悉Makefile 基本原理及语法规范熟练使用autoconf 和automake 生成Makefile嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.1 Linux下下C语言编程概述语言编程概述v3.1.1 C 语言简单回顾ANSI C硬件无关性中级语言结构化语言功能齐全可移植性强编译过程示意图嵌入式嵌入式Linux应
2、用程序开发标准教程应用程序开发标准教程3.1 Linux下下C语言编程概述语言编程概述v3.1.2 Linux 下C 语言编程环境概述编辑器vi编译链接器gcc调试器gdb项目管理工具make嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.3 gcc编译器编译器vgcc编译器版本GNU Compiler Collectionhttp:/gcc.gnu.orgGNU CC 4.6.2(2011.10.26)GNU CC 4.6.3GCC 4.3.0 GCC 2.95 July 31,1999 GCC 3.0 June 18,2001 GCC 3.2 August 14,2002
3、 GCC 3.3May 13,2003 December 3,1997 GCC 4.4.5 GCC 4.6.3Oct 26,2011嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.3 gcc编译器编译器vgcc编译环境GNU CC ANSI CC、C+、Object C、Java、Fortran、Pascal后缀名 所对应的语言 后缀名 所对应的语言 .c C 原始程序 .s/.S 汇编语言原始程序 .C/.cc/.cxx C+原始程序 .h 预处理文件(头文件).m Objective-C 原始程序 .o 目标文件 .i 已经过预处理的C 原始程序 .a/.so 编译后的库
4、文件 .ii 已经过预处理的C+原始程序 嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.3 gcc编译器编译器v3.3.1 gcc 编译流程解析gcc编译过程格式:gcc 选项 源文件 选项 目标文件Pre-processor(cpp/gcc-E)Compiler(cc1/gcc-S)Assembler(as/gcc-c)Linker(ld)hello.c(text)hello.i(text)hello.s(text)hello.o(binary)hello(binary)printf.o(binary)预处理:生成文件编译文件.i编译:代码翻译成汇编语言编译文件.s汇编:
5、转成目标文件编译文件.o二进制代码连接:默认使用动态库,生成可执行文件嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.3 gcc编译器编译器v3.3.2 gcc 编译选项分析(1)总体选项选项 含义-c 只是编译不链接,生成目标文件“.o”-S 只是编译不汇编,生成汇编代码 -E 只进行预编译,不做其他处理 -g 在可执行程序中包含标准调试信息 -o file 把输出文件输出到file 里 -v 打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir 在头文件的搜索路径列表中添加dir 目录 -L dir 在库文件的搜索路径列表中添加dir 目录 -static
6、链接静态库 -llibrary 连接名为library 的库文件 嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.3 gcc编译器编译器v3.3.2 gcc 编译选项分析(2)警告和出错选项选项含义-ansi 支持符合ANSI 标准的C 程序 -pedantic 允许发出ANSI C 标准所列的全部警告信息 -pedantic-error 允许发出ANSI C 标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出gcc 提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程(3)优化选项-On 来控制优化代码的生成,0
7、、1、2、3调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.4 gdb调试器调试器v3.4.1 gdb 使用流程gcc 编译过程一定要加上选项“-g”gdb 调试可执行文件查看文件 l设置断点 b nb n if var=20查看断点情况 info b运行代码 r查看变量值 p+变量名单步运行 n s恢复程序运行 c嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.4 gdb调试器调试器v3.4.2 gdb 基本命令help1工作环境相关命令2设置断点与恢复命令函数断点条件断点3gd
8、b 中源码查看相关命令4gdb 中查看运行数据相关命令5gdb 中修改运行参数相关命令v实验:用gdb调试程序的bug,P87嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make工程管理器工程管理器v自动编译管理器v通过读入Makefile 文件的内容来执行大量编译工作v用户只需编写一次简单的编译语句v3.5.1 Makefile 基本结构Makefile 是Make 读入的唯一配置文件需要由make工具创建的目标体(target),通常是目标文件或可执行文件要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)嵌
9、入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make工程管理器工程管理器v3.5.1 Makefile 基本结构Makefile 格式target:dependency_files commandMake 格式make target示例:hello.o:hello.c hello.h gcc c hello.c o hello.omake hello.o嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make工程管理器工程管理器v3.5.2 Makefile 变量时间戳make 允许在Makefile 中创建和使用变量变量是在Makefile 中定
10、义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值可以代替目标体、依赖文件、命令以及makefile 文件中其他部分两种变量定义方式递归展开方式,格式为VAR=var简单展开方式:定义格式为VAR:=varMake 中变量格式为$(VAR)嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make工程管理器工程管理器v3.5.2 Makefile 变量预定义变量命令格式含 义 AR 库文件维护程序的名称,默认值为ar AS 汇编程序的名称,默认值为as CC C编译器的名称,默认值为cc CPP C预编译器的名称,默认值为$(CC)E CXX C+编译器的名称,默
11、认值为g+FC FORTRAN编译器的名称,默认值为f77 RM 文件删除程序的名称,默认值为rm f ARFLAGS 库文件维护程序的选项,无默认值 ASFLAGS 汇编程序的选项,无默认值 CFLAGS C编译器的选项,无默认值 CPPFLAGS C预编译的选项,无默认值 CXXFLAGS C+编译器的选项,无默认值 FFLAGS FORTRAN编译器的选项,无默认值 嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make工程管理器工程管理器v3.5.2 Makefile 变量Makefile中常见自动变量命令格式含 义$*不包含扩展名的目标文件名称$+所有的依赖文
12、件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$第一个依赖文件的名称$?所有时间戳比目标文件晚的依赖文件,并以空格分开$目标文件的完整名称$所有不重复的依赖文件,以空格分开$%如果目标是归档成员,则该变量表示目标的归档成员名称 嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.5 Make 工程管理器工程管理器v3.5.3 Makefile 规则1隐式规则2模式规则%隐式规则目录 对应语言后缀名 规则 C编译:.c变为.o$(CC)c$(CPPFLAGS)$(CFLAGS)C+编译:.cc或.C变为.o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pa
13、scal编译:.p变为.o$(PC)-c$(PFLAGS)Fortran编译:.r变为-o$(FC)-c$(FFLAGS)嵌入式嵌入式Linux应用程序开发标准教程应用程序开发标准教程3.6 Make工程管理器工程管理器v3.5.4 Make管理器的使用常用的命令行选项v实验:编写包含多文件的Makefile,P89命令格式含 义-C dir 读入指定目录下的Makefile -f file 读入当前目录下的file文件作为Makefile -i 忽略所有的命令执行错误 -I dir 指定被包含的Makefile所在目录 -n 只打印要执行的命令,但不执行这些命令 -p 显示make变量数据库和隐含规则 -s 在执行命令时不显示命令 -w 如果make在执行过程中改变目录,则打印当前目录名