Linux开发基础.ppt
《Linux开发基础.ppt》由会员分享,可在线阅读,更多相关《Linux开发基础.ppt(51页珍藏版)》请在三一办公上搜索。
1、Linux开发基础,主要内容,Linux函数库如何使用GCCGDB简介MakefileSVN/GIT版本控制软件,Linux下函数库(1/3),一个“程序函数库”就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。可分为两种类型:静态函数库(static libraries):是一个普通的目标文件的集合,一般用“.a”作为文件的后缀。静态函数库和共享函数库相比有很多的缺点,占用内存空间多。但使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速度上快一些。可以用ar这个程序
2、来创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码。例如,把file1.o和file2.o加入到my_library.a这个函数库文件:arm-linux-ar rcs my_library.a file1.o file2.o 然后运行 arm-linux-ranlib,以给库加入一些索引信息,Linux下函数库(2/3),共享函数库(shared libraries):当一个可执行程序在启动的时候被加载的函数。每个共享函数库都有个特殊的名字,称作“soname”。soname名字命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最后是版本号信息。优
3、点:多进程使用同一函数库;修改函数库不需重新连编。安装一个新版本的函数库的时候,要先将这些函数库文件拷贝到一些特定的目录中,运行ldconfig就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。例如,创建两个目标文件(a.o和b.o),然后创建一个包含a.o和b.o的共享函数库。arm-linux-gcc-fPIC-g-c-Wall a.carm-linux-gcc-fPIC-g-c-Wall b.carm-linux-gcc-shared Wl-o liblusterstuff.so.1.0.1
4、a.o b.o 注:”-fPIC”是位置无关参数,”-g”和“Wall”参数不是必须的。,Linux下函数库(3/3),函数库和头文件的保存位置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:共享库管
5、理工具,一般在更新了共享库之后要运行该命令 ldd:可查看可执行文件所使用的共享函数库,使用GNU cc开发应用程序,gcc的简介 可执行文件的格式 gcc的使用,gcc的简介,gcc 是 GNU 的 C 和 C+编译器。实际上,gcc 能够编译多种语言:C、C+和 Object C等。利用 gcc 命令可同时编译并连接 C 和 C+源程序。也可以对几个 C 源文件利用 gcc 编译、连接并生成可执行文件。gcc可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,gcc的四个阶段,命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件
6、中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S或.s为后缀的汇编语言源代码文件汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的函数库中连到合适的地方。,可执行文件格式,Linux系统中可执行文件有两种格式。第一种格式是a.out格式,这种格式用于早期的Li
7、nux系统以及 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 options
8、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仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度
9、更快并且更易于管理。缺省时GCC建立的目标代码文件有一个.o的扩展名。例:gcc c test2.c-E 只运行 C 预编译器。-S 编译选项告诉 gcc 在为 C 代码产生了汇编语言文件后停止编译。-shared 生成共享目标文件。通常用在建立共享库时。-static 禁止使用共享连接。,警告选项,在gcc中用开关-Wall控制警告信息,使用示例命令如下:gcc Wall-o test3_1 test3_1.c-w 不生成任何警告信息。,查找选项,gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。-I选项:指定头文件的搜索目录
10、例: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 c test2.cgcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o,优化选项,优化选项可以使GCC在耗费更多编译时间和牺牲易调
11、试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。-O0 不进行优化处理。-O选项:告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项:告诉GCC 产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。-O3选项:比-O2 更进一步优化,包括 inline 函数。,版本选项,-v选项用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。gcc-v 将得到如下结果:-V 选项如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。gcc-
12、V2.6.3-v,宏定义选项,-D MACRO 以字符串“1”定义 MACRO 宏。-D MACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。-U MACRO 取消对 MACRO 宏的定义。,调试和剖析选项,使用调试选项后,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使gdb能够判断编译过的代码和源代码之间的关系。-g选项:告诉GCC产生能被 GNU 调试器使用的调试信息以便调试你的程序。例:gcc g o test3 test3.c-pg选项:告诉GCC在你的程序里加入额外的代码,执行时,产生gprof用的剖析信息以显示你的程序的耗时情
13、况。使用gdb调试工具,命令行如下:例:gcc ggdb3 o test3 test3.c,调试工具gdb,GDB调试器简介 gdb 的常用命令gdb应用实例,gdb 简介,Linux系统中包含了GNU 调试程序gdb,它是一个用来调试C和 C+程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb 所提供的一些功能如下所示:运行程序,设置所有的能影响程序运行的参数和环境;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;修改程序的错误,并重新运行程序;动态监视程序中变量的值;可以单步逐行执行代码,观察程序的运行状态。分析崩溃程序的产生的core文
14、件,gdb的特点,gdb的功能非常强大到目前为止,gdb已能够支持Moduls-2、Chill、Pascal和FORTRAN程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。例如调试FORTRAN程序时还不支持表达式的输入、输出变量或类FORTRAN的词法。gdb程序调试的对象是可执行文件,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用gdb调试。如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb 利用这些信息使源代码和机器码
15、相关联。gdb是一个用来调试C和C+程序的常用调试工具之一。,gdb的启动,在命令行上输入gdb并按回车键就可以运行gdb了,如果一切正常的话,将启动gdbgdb filename出现(gdb)在这里,可以输入调试命令在可以使用 gdb 调试程序之前,必须使用-g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量:CFLAGS=-g 运行,获取帮助信息,启动gdb后,可以在命令行上指定很多的选项。输入:help可以获得gdb的帮助信息。如果想要了解某个具体命令(比如break)的帮助信息,在gdb提示符下输入下面的命令:break屏幕上会显示关于break的帮助信息。从返
16、回的信息可知,break是用于设置断点的命令。另一个获得gdb帮助的方法是浏览gdb的手册页。在Linux Shell提示符输入:man gdb可以看到man的手册页,gdb命令的分类,在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:aliases:命令别名 breakpoints:断点定义;data:数据查看;files:指定并查看文件;internals:维护命令;running:程序执行;stack:调用栈查看;statu:状态查看;tracepoints:跟踪程序执行。后跟命令的分类名,可获得该类命令的详细清单,基本gdb命令(1/2),file命令:装入想要调试的可
17、执行文件。cd命令:改变工作目录。pwd命令:返回当前工作目录。run命令:执行当前被调试的程序。kill命令:停止正在调试的应用程序。list命令:列出正在调试的应用程序的源代码。break命令:设置断点。watch命令:设置监视点,监视表达式的变化。awatch命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与watch命令相同。rwatch命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与watch相同。next命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的
18、执行。,基本gdb命令(2/2),step命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。display命令:在应用程序每次停止运行时显示表达式的值。info break命令:显示当前断点列表,包括每个断点到达的次数16)info files命令:显示调试文件的信息。17)info func命令:显示所有的函数名。18)info local命令:显示当前函数的所有局部变量的信息。19)info prog命令:显示调试程序的执行状态。20)print命令;显示表达式的值。21)delete命令:删除断点
19、。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。22)Shell命令:执行Linux Shell命令。23)make命令:不退出gdb而重新编译生成可执行文件。24)Quit命令:退出gdb。,gdb 使用实例(1/2),/*一个有错误的 C 源程序*/#include#include static char buff 256;static char*string;int main()printf(Please input a string:);gets(string);printf(nYour string is:%sn,string);上面这个程序非常简单,其目的是接受用户
20、的输入,然后将用户的输入打印出来。该程序使用了 一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 Segment Fault 错误:$gcc-o test-g test.c$./test Please input a string:asfd Segmentation fault(core dumped),gdb 使用实例(2/2),为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:1运行 gdb bugging 命令,装入 bugging 可执行文件;2执行装入的 bugging 命令;3使用 where 命令查看程序出错的地方;4利用 list 命令查
21、看调用 gets 函数附近的代码;5唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看 string 的值;6在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为 此,我们在第 11 行处设置断点;7程序重新运行到第 11 行处停止,这时,我们可以用 set variable 命令修改 string 的取值;8然后继续运行,将看到正确的程序运行结果。,GNU make和makefile,GNU make概述Makefile 的基本结构Makefile中的变量GNU make 的主要预定义变量Makefile的隐含规则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 开发 基础

链接地址:https://www.31ppt.com/p-5438009.html