Linux程序设计基础—C环境(gcc-gdb-makefile)课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Linux程序设计基础—C环境(gcc-gdb-makefile)课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 程序设计 基础 环境 gcc gdb makefile 课件
- 资源描述:
-
1、 2005 博创科技北北 京京 博博 创创 兴兴 业业 科科 技技 有有 限限 公公 司司BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co.,LTD博创科技 嵌入互动Linux开发基础原仓周专业.第二章 Linux程序设计基础C环境 Linux编程概述 文本编辑器vi Linux下函数库 GCC及其使用 调试工具gdb GNU make和makefile 专业.Linux编程概述 Linux软件开发一直在Internet环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问Web站点,就可以启动一个以Linux为基础的软件项目。Linux开发工作经
2、常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。大多数Linux软件是经过自由软件基金会(Free Software Foundation)提供的GNU(GNU 即 GNUs not UNIX)公开认证授权的,因而通常被称作GNU软件。GNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。专业.Linux程序需要首先转化为低级机器语言
3、即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。shell编程语言如BASH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解释器。用这些语言编制的程序尽管是应用程序文件,但可以直接运行。编译器则不同,它将生成一个独立的二进制代码文件然后才可以运行。专业.Linux编程风格 GNU风格 Linux 内核编程风格 专业.GNU风格(1/2)函数返回类型说明和函数名分两行放置,函数起始字符和函数开头左花括号放到最左边。尽量不要让
4、两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。按照如下方式排版do-while语句:dowhile()每个程序都应该以一段简短的说明其功能的注释开头。请为每个函数书写注释,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。不要声明多个变量时跨行,每一行都以一个新的声明开头。专业.GNU风格(2/2)当一个if中嵌套了另一个if-else时,应用花括号把if-else括起来。要在同一个声明中同时说明结构标识和变量或者
5、结构标识和类型定义(typedef)。先定义变量,再使用。尽量避免在if的条件中进行赋值。请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似ignore_space_change_flag的名字;不要使用类似iCantReadThis的名字。用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。专业.Linux 内核编程风格 Linux内核缩进风格是8个字符。Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。命名尽量简洁。不应该使用诸如This
6、VariableIsATemporaryCounter之类的名字。应该命名为tmp,这样容易书写,也不难理解。命名全局变量,应该用描述性命名方式,例如应该命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免过长。函数最好短小精悍,一般来说不要让函数的参数多于10个,否则应该尝试分解这个过于复杂的函数。通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重要的部分,但是不能过多。专业.文本编辑器vi vi的模式 vi的进入 命令模式 插
7、入模式 末行模式专业.vi的模式 Command Mode(命令模式)这是执行vi后的缺省模式 此时键盘输入当作命令 命令有大小写之区分 Input Mode(插入模式)使用 a、i、o、c、r、s 进入插入模式 用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上 按下 ESC 键即可回到 Command Mode专业.vi的模式 Last Mode(末行模式)在 Command Line 按下:即可进入该模式 用来进行保存文件、打开文档或环境的设定 命令有大小写之分专业.专业.vi的进入和内容输入 进入:vi 文件名 输入文件内容 (进入插入模式)新增(append)a 从光
8、标所在位置后面开始新增内容 A 从光标所在行最后面的地方开始新增内容。插入(insert)i 从光标所在位置前面开始插入内容 I 从光标所在行的第一个非空白字符前面开始插入资料。开始(open)o 在光标所在行下新增一行并进入输入模式。O 在光标所在行上新增一行并进入输入模式。(命令模式)专业.命令模式 1、光标的移动 h 左移一个字符 l 右移一个字符j 下移一行 k 上移一行w,W 跳至后一个字的开头(W忽略标点)b,B 跳至前一个字的开头(B忽略标点)e 移动到后一个字的末尾 至本行第一个非空字符$至行尾 0 至行首H 移动到当前窗口的第一列 M 移动到当前窗口的中间列 L 移动到视窗的
9、最后一列)光标所在位置到下个句子的第一个字母 (光标所在位置到该句子的第一个字母 光标所在位置到该段落的最后一个字母 光标所在位置到该段落的第一个字母专业.命令模式 1、光标的移动(续)nH 将光标移到屏幕的第 n 行nL 将光标移到屏幕的倒数第 n 行CTRL-d 向下半页CTRL-f 向下一页CTRL-u 向上半页 CTRL-b 向上一页 n-减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以 上 n 行n+加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下 n 行专业.命令模式 2、删除x 删除光标所在字符 X 删除光标前面的字符 s 删除光标所在字符,并进
10、入输入模式 S 删除光标所在的行,并进入输入模式 dd 删除光标所在的行 D 从光标位置开始删除到行尾 d与光标移动命令的组合专业.命令模式 3、修改 r 修改光标所在字符,r 后接着要修改的字符。如,rc 可以用字符“c”替换光标所指向的当前字符 R 进入替换状态,新增内容会覆盖原先内容,直到按 ESC 回到命令模式下为止 cc 修改光标所在行 C 修改从光标位置到该行末尾的内容 c 与光标移动命令的组合专业.命令模式 4、复制和移动yy 复制当前行到内存缓冲区nyy 复制 n 行内容到内存缓冲区 y与光标移动的组合p 将缓冲区的内容粘贴到光标的后面P 将缓冲区的内容粘贴到光标的前面另:在末
11、行模式下实现移动:n1,n2 m n3:把 n1到n2 行内容搬到第 n3 行后专业.5 5、搜索字符串、搜索字符串/pattern 移至下一个包含pattern的行?pattern 移至上一个包含pattern的行/往下重复查找?往上重复查找n 在同一方向重复查找N在相反方向重复查找/pattern/+n移至下一个pattern所在行后的第n行?pattern?-n 移至上一个Pattern所在行前的第n行6 6、其他、其他 u 撤销前一条命令的结果*.$/包含在查找字符串中,要用转义字符()命令模式专业.末行模式 1、文件的保存和退出:w 保存:q 退出:w!强制保存:q!强制退出:wq
12、保存退出:wq!强制保存退出专业.末行模式 2、字符串的替换 :s/str1/str2/用字符串 str2 替换行中首次出现的字符串 str1 :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1 :.,$s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1 :1,$s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1 :g/str1/s/str2/g 功能同上 专业.末行模式 其他::n 将光标移到第 n 行 编辑多个文件vi file1 file2:n 编辑下一个文件:e filena
13、me 编辑指定文件专业.Linux下函数库(1/3)一个“程序函数库”就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。可分为两种类型:静态函数库(static libraries):是一个普通的目标文件的集合,一般用“.a”作为文件的后缀。静态函数库和共享函数库相比有很多的缺点,占用内存空间多。但使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速度上快一些。可以用ar这个程序来创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码。例如,把fil
14、e1.o和file2.o加入到my_library.a这个函数库文件:ar rcs my_library.a file1.o file2.o 然后运行 ranlib,以给库加入一些索引信息专业.Linux下函数库(2/3)共享函数库(shared libraries):当一个可执行程序在启动的时候被加载的函数。每个共享函数库都有个特殊的名字,称作“soname”。soname名字命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最后是版本号信息。优点:多进程使用同一函数库;修改函数库不需重新连编。安装一个新版本的函数库的时候,要先将这些函数库文件拷贝到一些特定的目录中,运行l
15、dconfig就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。例如,创建两个目标文件(a.o和b.o),然后创建一个包含a.o和b.o的共享函数库。gcc-fPIC-g-c-Wall a.cgcc-fPIC-g-c-Wall b.cgcc-shared-Wl,-soname,liblusterstuff.so.1-o liblusterstuff.so.1.0.1 a.o b.o lc 注:”-fPIC”是位置无关参数,”-g”和“Wall”参数不是必须的。专业.Linux下函数库(3/3)函数库
16、和头文件的保存位置 a.函数库/lib:系统必备共享函数库 /usr/lib:标准共享函数库和静态函数库 /usr/i486-linux-libc5/lib:libc5 兼容性函数库 /usr/X11R6/lib:X11R6 的函数库 /usr/local/lib:本地函数库 b.头文件/usr/include:系统头文件 /usr/local/include:本地头文件 c.共享函数库的相关配置和命令/etc/ld.so.conf:包含共享库的搜索位置 ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令 ldd:可查看可执行文件所使用的共享函数库 专业.使用GNU cc开发
17、应用程序 gcc的简介 可执行文件的格式可执行文件的格式 gcc的使用 专业.gcc的简介 gcc 是 GNU 的 C 和 C+编译器。实际上,gcc 能够编译多种多种语言:C、C+和 Object C等。利用 gcc 命令可同时编译并连接 C 和 C+源程序。也可以对几个 C 源文件利用 gcc 编译、连接并生成可执行文件。gcc可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理预处理链接编译组译源 程 序(*.c)可执行文件预处理器编译器组译器连接器专业.gcc的四个阶段 命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的
18、文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S或.s为后缀的汇编语言源代码文件汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的函数库中连到合适的地方。专业.可执行文件格式可执行文件格式 Linux系统中可执行文件有两种格式。第一种格式是a.out格式,这种格式
19、用于早期的Linux系统以及 Unix系统的原始格式。a.out来自于Unix C编译程序默认的可执行文件名。当使用共享库时,a.out格式就会发生问题。把a.out格式调整为共享库是一种非常复杂的操作。因此,一种新的文件格式被引入Unix系统5的第四版本和Solaris系统中。它被称为可执行和连接的格式(ELF)。这种格式很容易实现共享库。ELF格式已经被Linux系统作为标准的格式采用。gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。专业.GNU C 的使用 基本语法 gcc
20、 options filenames 说明:在gcc后面可以有多个编译选项,同时进行多个编译操作。很多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的:gcc-p-g test1.c gcc -pg test1.c 当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。专业.gcc选项-o选项 你能用-o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。例:gcc o count count.c -c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因
21、为它使得编译多个C程序时速度更快并且更易于管理。缺省时GCC建立的目标代码文件有一个.o的扩展名。例:gcc c test2.c-E 只运行 C 预编译器。-S 编译选项告诉 gcc 在为 C 代码产生了汇编语言文件后停止编译。-shared 生成共享目标文件。通常用在建立共享库时。-static 禁止使用共享连接。专业.警告选项警告选项 在在gccgcc中用开关中用开关-Wall-Wall控制警告信息,使用示例命令如下:控制警告信息,使用示例命令如下:gcc Wall-o test3_1 test3_1.cgcc Wall-o test3_1 test3_1.c-w-w 不生成任何警告信息。
22、不生成任何警告信息。专业.查找选项 gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。-I选项:指定头文件的搜索目录例:gcc I/export/home/st o test1 test1.c-L选项:指定库文件的搜索目录例:gcc L/usr/X11/R6/lib o test1 test1.c专业.多个源文件生成一个可执行文件 问题:有多个源文件时,如何生成一个可执行文件?方法1:gcc Wall o mytest test1.c test2.c test3.c 方法2:gcc-Wall-c test1.cgcc-Wall
23、c test2.cgcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o专业.优化选项 优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。-O0 不进行优化处理。-O选项:告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项:告诉GCC 产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。-O3选项:比-O2 更进一步优化,包括 inline 函数。专业.版本选项-v选项 用户将会得
24、到自己目前正在使用的gcc的版本及与版本相关的一些信息。gcc -v 将得到如下结果:Reading specs from/usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2-V 选项 如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。gcc-V2.6.3 -v专业.宏定义选项-D MACRO 以字符串“1”定义 MACRO 宏。-D MACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。-U MACRO 取消对 MACRO 宏的定义。专业.调试和剖析选项 使用调试选项后
25、,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使gdb能够判断编译过的代码和源代码之间的关系。-g选项:告诉GCC产生能被 GNU 调试器使用的调试信息以便调试你的程序。例:gcc g o test3 test3.c-pg选项:告诉GCC在你的程序里加入额外的代码,执行时,产生gprof用的剖析信息以显示你的程序的耗时情况。使用gdb调试工具,命令行如下:例:gcc ggdb3 o test3 test3.c 专业.调试工具gdb GDB调试器简介 gdb 的常用命令 gdb应用实例 专业.gdb 简介 Linux系统中包含了GNU 调试程序gdb,
展开阅读全文