gcc与gdb使用PPT课件
实验二 GCC 及GDB的使用
实验二GCC 及GDB的使用一、实验目的和要求a)掌握VI编译环境。
b)掌握GCC编译命令。
c)掌握多个文件共同编译方法。
d)掌握GDB调试命令。
二、实验内容和原理(可参照课件第五章)a)在VI编辑器里编写简单的“hello,world,I am 13050141XX XXX”,利用GCC编译为可执行文件,执行,观察运行结果。
b)在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
c)编写循环结构的程序,利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
三、实验环境a)硬件:PC机b)软件:LINUX操作系统、虚拟机四、实验步骤vi hello.c i:C语言编程Esc :wq gcc hello.c gdb file a.out run a实验三交叉编译环境配置一、实验目的和要求熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。
使用Linux 的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容a)配置网络,包括配置IP 地址、NFS 服务、防火墙。
b)安装交叉编译器c)配置超级终端,下载文件到目标机上。
三、实验设备及工具(包括软件调试工具)硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:REDHAT LINUX 9.0+超级终端+ARM-LINUX 开发环境四、实验步骤(所有的内容截图)1、虚拟机设置为桥接模式。
2、配置IP地址,设置为192.168.0.xxx参照实验指导书图1.4.1-1.4.3. 自己截图,说明3、关闭防火墙,参照实验指导书图1.4.4自己截图,说明4、打开桌面超级终端(HyperTerminal),配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。
实验一 gcc和gdb的使用
3.执行当前目录下编译生成的可执行文件,使 用以下格式: ./可执行文件名 ./a.out
也可以使用以下方法编译源代码文件.生成自 命名的可执行文件; gcc源文件-o自命名的文件名 例如:gcc test.c –o test
4.gdb简介 Linux包含了一个叫gdb的GNU调试程序。gdb是一个 用来调试c和c十十程序的强力调试器。它使用户能在 程序运行时观察程序的内部结构和内存的使用情况。 以下是gdb所提供的一些功能: 能监视程序中变量的值; ·能设置断点以使程序在指定的代码行上停止执行; ·能一行行地执行代码。
在命令行上键入gdb并按回车键就可以运行gdb 了, 如果一切正常的话,gdb将被启动,并且将 在屏幕上显示类似的内容:
实验内容 将下面的程序输入到一个文件名字为 test.c的磁盘文件中,利用调试程序找出 其中的错误,修改后存盘。该程序的功 能是显示一个简单的问候语,然后用反 序方式将它列出。
实பைடு நூலகம்一 gcc和gdb的使用
实验目的 1.掌握Linux操作系统下最常用的c 语言编译器gcc的使用 2.掌握Linux操作系统下最常用的 代码调试器gdb的使用; 3.掌握调试代码的基本方法,如 观察变量、设置断点等。
gcc简介 gcc 是Linux操作系统下一种常用的c语言编译器。 1.使用文本编辑器编写完源程序,保存成 .c为扩展名的c语言源代码文件。 2.返回到shell界面,使用gcc对源程序进行编泽 其命令为: gcc 源程序 例 : gcc test.c 如果源代码没有语法错误,使用以上命令编译,会在 当前目录下生成一个名为a.out的可执行文件。如果源代码 有语法错误,则不会生成任何文件,gcc编译器会在shell 中提示错误的地点和类型。(可使用gdb来调试)
gcc_gdb
↗
↓
file (可执行 目标程序 (二进制))
▲ 汇编阶段 接下来在命令行输入(as file.s -o file.o) 汇编器将file.s翻译成机器语 言指令,把这些指令打包成为一种叫做可重定位目标程序格式,并将结果保存在目 标文件(file.o) 中, file.o文件是一个二进制文件,它的字节编码是机器语言指令而 不是字符,如果我们在文本编辑器中打开file.o文件,呈现的将是一堆乱码. ▲ 链接阶段 然后在命令行中输入: ld file.o -lc /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o --dynamic-linker /lib/ld-linux.so.2 -o file 注意我们的程序调用了printf函数,它是标准C库的一个函数,printf函数对应的 标文件printf.o是存放在标准C库的共享库文件libc.so.6中的。因此,必须在链 接时,将libc.so.6中的printf.o合并到输出文件file中。此外,为了建立程序在 执行时的运行环境,我们还必须把建立和支持运行环境的目标文件crt1.o、 crti.o、crtn.o和动态连接库文件ld-linux.so.2(在参数--dynamic-linker后指 定)合并到输出文件file中。
gcc/gdb简要入门
本文档由电子信息科学与技术系2006级的孙学婷同学撰写, 介绍了在Linux下使用gcc和gdb来编译和调试C程序的基本方 法,略有修正。在此向她表示感谢!
实验平台:计算机,Linux系统及其编程工具 (一)gcc和gdb简介
GCC原本是”GNU C Compiler”的意思,但是它不只是C语言的不编译器,现在能够 支持多种其他语言,包括C++,Java等.它使用可替换的后端处理器,以产生适合于不同 算机体系结构上的可执行文件。gcc手册网址:/onlinedocs/。 GDB(GNU symbolic debugger)GNU开源组织发布的一个强大的UNIX下的 程序调试工具。 它的重要工作就是测试程序和排除错误,实际上它就是一个程序,可 以在一个严密的环境中执行另一个程序. gdb手册网址:/software/gdb/documentation/
gcc和gdb
一. gcc编译器1.简介及功能GNU CC(简称为Gcc)是GNU项目中符合ANSIC 标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
Gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3 和Ada 等多种语言,而且Gcc 又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
2.Gcc 编译流程分为4个步骤:·预处理(Pre-Processing);·编译(Compiling);·汇编(Assembling);·链接(Linking)。
(1)预处理阶段在该阶段,编译器将头文件编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc 在预处理结束后停止编译过程。
(2)编译阶段Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
(3)汇编阶段汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。
4)链接阶段在成功编译之后,就进入了链接阶段。
在这里涉及到一个重要的概念:函数库。
函数库一般分为静态库和动态库两种。
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中。
其后缀名一般为“.a” 。
动态库与之相反,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
动态库一般后缀名为“.so” 库。
Gcc在编译时默认使用动态库。
3格式及选项参数Gcc指令的一般格式为:Gcc [选项] 要编译的文件[选项] [目标文件](1). 总体选项3)优化选项Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。
#GCC和Gdb
2.2.1 vi 简介
vi 使用了两种状态,一是命令状态(Command Mode),另一是插入状态(Insert Mode)。 当 vi 处于命令状态时,输入的内容将作为命令来解释;另一方面,当 vi 处于插入状态时,
就可以插入字符。大多数 vi 命令是单字符,由插入状态改变为命令态,指 Esc 键;而由命 令状态转为插入状态,则可以输入相应的插入命令,直接输入,无需再按回车键。
命令
说明
:q!
放弃任何改动并退出 vi 系统
:w <filename>
保存当前的文件
:wq
保存当前的文件,并退出 vi 系统
:x
与 wq 类似
:zz
与 wq 的工作类似
版权所有:东北大学计算中心
-3-
C 程序设计实验指导
表 2-2 保存与退出命令
2.2.6 文件的编辑
文件的所有编辑的操作必须在插入状态下进行。从命令状态切换到插入状态的命令参见 表1。下面是一个经 vi 打开的一个文件 This is a test
~
~
最后一行开始处的波折号(~)表示文件的结尾。打开文件之后,即可适用对文件进行编辑
操作。
1.插入文本 当 vi 处于插入状态时,才可以插入文本到当前的位置。输入新的文本,只需从键盘输
入字符即可。参考表1中所列命令。
2.删除文本 删除单个字符可以使用 delete 键或 backspace 键。对于复杂的删除命令,可以参考如下的命 令列表:
与删除命令一样,在指令前输入次数,表示执行该指令多少次。
4.文本搜索 vi 还提供了丰富的文本搜索命令,方便用户搜索特定字符串。Vi 将搜索整个文件,直
至找到与搜索字符串相匹配的文本出现。文本搜索可以通过表5所示的一组命令来实现。
2.gcc编译器(ppt)
Gcc Gcc编译器编译器主讲人主讲人::李奎什么是什么是gcc gccGcc Gcc是一种编译工具是一种编译工具是一种编译工具。
它能够将高级语言它能够将高级语言((如c 语言)编写的文件编译生成操作系统可以执行的二进制工具Gcc Gcc工具的编译过程工具的编译过程•Gcc Gcc把源文件把源文件把源文件((.c .c文件文件文件))生成操作系统可执行的文件要经历四个过程要经历四个过程。
这个四个过程是预处理这个四个过程是预处理、、编译编译、、汇编汇编、、链接链接。
它们是按顺序执行的它们是按顺序执行的。
如下如所示如下如所示::预处理链接编译汇编源文件.C 可执行文件预处理器编译器汇编器连接器预处理阶段预处理器是在真正的翻译源文件开始之前由是在真正的翻译源文件开始之前由gcc gcc gcc编译编译器调用的独立程序器调用的独立程序。
预处理器可以删除注释预处理器可以删除注释、、包含其他文件以及进行宏替换其他文件以及进行宏替换。
编译阶段编译阶段的主要工作是把我们的源代码生成相应的汇编代码的过程汇编代码的过程。
这个阶段花费的时间会比较长这个阶段花费的时间会比较长。
它需要对我们的它需要对我们的C C 语言进行语法和语义的分析语言进行语法和语义的分析,,还需要优化我们的代码要优化我们的代码,,最终生成汇编代码最终生成汇编代码。
汇编阶段首先我们应该知道汇编代码首先我们应该知道汇编代码((汇编指令汇编指令))并不是机器能够执行的语言器能够执行的语言。
我们还必须把汇编语言翻译成计算机能识别的机器语言计算机能识别的机器语言,,这个翻译的过程是在汇编阶段完成的编阶段完成的。
链接阶段链接阶段是通过链接器完成的链接阶段是通过链接器完成的。
链接器是一个独立的程序的程序,,它将一个或者多个由编译器或汇编器生成的目标文件外加库链接为一个可执行的文件的目标文件外加库链接为一个可执行的文件。
•一般来说一般来说,,系统安装后就已经安装和设定好了系统安装后就已经安装和设定好了gcc gcc gcc。
课件:实验(常用开发工具gcc,gdb)
-v
功
Байду номын сангаас
能
只生成目标文件,不进行连接。用于对源文件的分别编译
只进行编译,不做汇编,生成汇编代码文件格式,其名与 源文件相同,但扩展名为.s
将输出放在文件file中。如果未使用该选项,则可执行文件 放在a.out中
指示编译程序在目标代码中加入供调试程序gdb使用的附 加信息
在标准出错输出上显示编译阶段所执行的命令,即编译驱 动程序及预处理程序的版本号
gdb调试程序常用选项及其作用
进入gdb调试:gdb file 查看源代码:list 设置断点:break 30 查看断点设置情况:info b 运行代码:run 单步运行代码:next 查看暂停点变量值:print 变量 继续程序的运行:continue 退出Gdb:quit
三、实验步骤
1.在家目录下使用mkdir命令新建文件夹,文件夹以自己的汉语拼音名字命 名。使用cd命令进入到该文件夹中,所有实验内容都在该文件夹下进行。
2.使用vim编辑如下程序,并使用gcc编译,使用gdb调试。
3.使用vim/vi编辑如下程序,并 使用gcc编译,使用gdb调试。
常用开发工具(gcc,gdb)
一、实验目的 1.使用vim/vi编写简单的C程序; 2.使用gcc对程序进行编译; 3.使用gdb对程序进行调试。 二、实验内容 1. helloworld程序。 2. 字符串处理程序。 3. 数学计算程序。
gcc编译程序常用选项及其作用
选项格式 -c -S
-o file
GDB调试简易教程.ppt
刘鹏昊
GDB简介:
调试器(例如GDB)能让你观察一个程序在执行时的内 部活动,或者程序出错时发生了什么
GDB主要能为你做四件事情:
运行你的程序,设置所有的能影响程序运行的东西 保证你的程序在指定的条件下停止 当你程序停止时,让你检查发生了什么 改变你的程序。那样你可以试着修正某个bug引起的问题,
交叉调试环境: 目标板:gdbserver :port –attach <PROCESS-ID> 调试端:target remote ip:port
停止调试: detach
GDB下运行程序
调试一个多线程的程序:
GDB会自动提示新线程创建 thread <threadno> 各线程间进行切换 info threads 查看已经存在的线程
-symbols <文件名>(-s <文件名>) 从<文件名>中读去符号
-x <文件名> 执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb
命令,就象一个批处理
-directory(-d) <路径> 指定路径。把<路径>加入到搜索源文件的路径中
常用启动参数:
-quiet (-q) 安静模式,不输出介绍和版权信息
不用退出GDB就可以执行一个shell命令
make [make-args] 使用[make-args]进行make 相当于`shell make make-args'
GDB命令
命令输入技巧:
可以把一个gdb命令缩写成开头几个字母,如果这没有二意性你可以直接回车来运行。 如果有不止一个选择的话,你还可以使用TAB键让gdb给你完成接下来的键入,或向你 显示可选择的命令
实验一 gcc和gdb的使用
实验一 gcc和gdb的使用
实验目的 1.掌握Linux操作系统下最常用的c 语言编译器gcc的使用 2.掌握Linux操作系统下最常用的 代码调试器gdb的使用; 3.掌握调试代码的基本方法,如 观察变量、设置断点等。
4.gdb简介 Linux包含了一个叫gdb的GNU调试程序。gdb是一个 用来调试c和c十十程序的强力调试器。它使用户能在 程序运行时观察程序的内部结构和内存的使用情况。 以下是gdb所提供的一些功能: 能监视程序中变量的值; · 能设置断点以使程序在指定的代码行上停止执行; · 能一行行地执行代码。
在命令行上键入gdb并按回车键就可以运行gdb 了, 如果一切正常的话,gdb将被启动,并且文件名字为 test.c的磁盘文件中,利用调试程序找出 其中的错误,修改后存盘。该程序的功 能是显示一个简单的问候语,然后用反 序方式将它列出。
实验预备内容 1.阅读在线帮助命令man gcc的 内容,了解gcc的基本使用 2.阅读在线帮助命令man gdb的 内容,了解gdb的基本使用
gcc简介 Unix上使用的c语言编译器gcc,在Linux上的派生就是 gcc。在使用vi编写完源程序之后,返回到shell界面,使用 gcc对源程序进行编泽的命令为: gcc 源程序 其中,“源程序”即为编写的以.c为扩展名的c语言源代 码文件。
3、
如果源代码没有语法错误,使用以上命令编译,会在 当前目录下生成一个名为a.out的可执行文件。如果源代码 有语法错误,则不会生成任何文件,gcc编译器会在shell 中提示错误的地点和类型。
也可以使用以下方法编译源代码文件.生成自 命名的可执行文件; gcc源文件-o自命名的文件名 执行当前目录下编译生成的可执行文件,使用 以下格式: ./可执行文件名 当使用gcc编译程序源代码的时候,可能会因 为源代码存在语法错误,编译无法进行下。这 时候,就可以使用调试器gdb来对程序进行调 试。
LinuxGCCG编译器与调试器PPT课件
作者:赵俭平
注意:如果安装过程中提示需要选择编译器
3.1.2 GCC/G++编译命令
GCC/G++编译器没有图形界面,只能在终端 上以命令方式运行。编译命令由命令名、选 项和源文件名组成,格式如下所示:
gcc [-选项 1] [-选项 2]…[-选项 n] <源文件名 >
在函数原型中以“_t”结尾的类型被称为原始 系统数据类型。原始系统数据类型定义在头 文件“sys/types.h”中,以typedef操作符加以 定义。原始系统数据类型是目标系统数据结 构的接口,在不同的操作系统中,其字长会 有变化。
作者:赵俭平
3.4 编译hello world
hello world程序作为程序员学习的第一个程 序已成为有趣的惯例。本节将讲述如何使用 Linux系统中默认的编译器编辑该程序的源 代码,并使用GCC编译器将该程序编译为可 执行文件。
第3章 Linux GCC/G++编译器与调试 器
编译器是将易的低阶 机器语言的程序。调试器是用于查找源代码 中的错误,测试源代码和可执行文件的工具 。GNU项目提供了GCC编译器、G++编译器 和GDB调试器,这些程序是在Linux系统上 使用C和C++语言进行开发的重要工具。本 章将介绍这些工具的安装和使用方法。
作者:赵俭平
3.1.1 GCC/G++编译器安装
安装或更新GCC和G++可在GNU项目的官方 网站()去下载相应的安装包 ,也可以使用YUM软件包管理器安装。安 装GCC和G++的命令如下:
gcc和gdb介绍和用法
***************gdb介绍*********************GNU 的调试器称为gdb,该程序是一个交互式工具,工作在字符模式。
在X Window 系统中,有一个gdb 的前端图形工具,称为xxgdb。
gdb 是功能强大的调试程序,可完成如下的调试任务:* 设置断点;* 监视程序变量的值;* 程序的单步执行;* 修改变量的值。
在可以使用gdb 调试程序之前,必须使用-g 选项编译源文件。
可在makefile 中如下定义CFLAGS 变量:CFLAGS = -g运行gdb 调试程序时通常使用如下的命令:gdb progname在gdb 提示符处键入help,将列出命令的分类,主要的分类有:* aliases:命令别名* breakpoints:断点定义;* data:数据查看;* files:指定并查看文件;* internals:维护命令;* running:程序执行;* stack:调用栈查看;* statu:状态查看;* tracepoints:跟踪程序执行。
键入help 后跟命令的分类名,可获得该类命令的详细清单。
*********gdb 的常用命令***************命令解释break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。
该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。
其用法为:clear FILENAME:NUM。
continue 继续执行正在调试的程序。
该命令用在程序由于处理信号或断点而导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。
表达式由程序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
第二课-GCC、GDB、Makefile、SVN
第二课:VIM,GCC,GDB,Makefile,SVN,Eclipse
二,GCC使用-选项
-E :预处理后即停止,不进行编译.预处理后的代码送往标 准输出. 同样可以以下面的程序为例: 如test1.c #include <stdio.h> main(int argc, char **argv) { printf("This is a test\n"); #ifdef DEBUG printf("DEBUG is defined"); #endif return 0; } 执行如下语句: gcc –E test.c 它在标准输出中显示的结果代码里已去掉了预处理 部分的代码
课程内容
VIM编辑器 GCC使用 GDB的使用 Makefile编写 版本管理工具:SVN 附课:Eclipse开发环境
本课包含一个建议任务的列表和一组测试题.
第二课:VIM,GCC,GDB,Makefile,SVN,Eclipse
一,VIM编辑器
概述:代码编辑工具VIM 课程:启动VIM 插入文本 光标移动 删除字符 撤销和重做 查找和替换 编辑多个文件 退出和帮助
LINUX环境编程-第二课
VIM,SVN,GCC, GDB, , , , , Makefile
课程目标
掌握文本代码编辑工具VIM . 掌握软件版本管理工具SVN. 掌握编译工具GCC. 了解Makefile编写. 熟练GDB调试工具 .
第二课:VIM,GCC,GDB,Makefile,SVN,Eclipse
第二课:VIM,GCC,GDB,Makefile,SVN,Eclipse
二,GCC使用-链接选项
-static :在支持动态连接(dynamic linking)的系统上,阻止连接 共享库.该选项在其他系统上无效. 同样对于test3.c,大家执行gcc test3.c -lm -o test3之后,可以 使用"ldd test3"指令查看它依赖于哪些动态库: libm.so.6 => /lib/tls/libm.so.6 (0x00475000) libc.so.6 => /lib/tls/libc.so.6 (0x0033e000) /lib/ld-linux.so.2 (0x00324000) 如果我们使用-static选项: gcc -static test3.c -o test3s 然后我们使用ldd指令查看,会看到它的提示如下: not a dynamic executable -shared:生成一个共享目标文件,他可以和其他目标文件连 接产生可执行文件.只有部分系统支持该选项.
gcc与gdb的使用
1. 2. 3. 4.
gcc gcc gcc gcc
–E hello.c –o hello.i –S hello.i –o hello.s –c hello.s –o hello.o hello.o –o hello
1.gcc hello.c -static –o hello 2.gcc hello.c –o hello 3.gcc hello.c -shared –o hello 比较1、2、3 生成可执行文件的大小 gcc –g hello.c –o hello gcc hello.c –o hello 比较1、2生成可执行文件的大小
gcc常用编译选项如下: -w 不生成任何警告信息 -Wall 生成所有级别的警告信息 -Werror 把所有警告当成错误,中止编译 -S 生成汇编代码后,输出汇编代 码,并停止工作
大纲
gcc简介 gcc的基本操作 gdb的使用
gcc的基本操作
下面是一个简单的C程序,用来说明gcc 的使用方法:
gcc简介
gcc识别的主要文件扩展名如下: .c C语言代码 .C, .cc C++语言代码 .i 预处理后的C语言代码 .ii 预处理后的C++语言代码 .s, .S 汇编语言代码 .o 目标代码 .a 静态链接库(程序编译时使用) .so 动态链接库(程序运行时使用)
gcc简介
gcc常用编译选项如下: -ansi 只支持ANSI标准的C语法,禁止 GNU C的某些特色,如asm关键字 -c 只生成object文件,不链接 -DMACRO 定义MACRO宏为字符串“1” -DMACRO=DEF 定义MACRO宏为字符串“DEF” -UMACRO 取消对MACRO宏的定义 -E 只运行C预编译器cpp -g 生成可被gdb使用的标准调试信息
第0讲 GCC和GDB
GDB概述 GDB概述
GDB是GNU开源组织发布的一个强大的 是 开源组织发布的一个强大的 UNIX/Linux下的程序调试工具。 下的程序调试工具。 下的程序调试工具 启动你的程序, 启动你的程序,可以按照你的自定义的要求随心所 欲的运行程序。 欲的运行程序。 可让被调试的程序在你所指定的调置的断点处停住。 可让被调试的程序在你所指定的调置的断点处停住。 断点可以是条件表达式) (断点可以是条件表达式) 当程序被停住时, 当程序被停住时,可以检查此时你的程序中所发生 的事。 的事。 动态的改变你程序的执行环境。 动态的改变你程序的执行环境。
动态库的使用
-llibrary 名字为 名字为library的动态链接库。事实上 的动态链接库。 的动态链接库 此动态链接库在文件系统中的名字为 liblibrary .so。连接器会自动加上 。连接器会自动加上lib*.so。 。 -Ldir 共享库搜索目录。gcc除了会在自定义的目 共享库搜索目录。 除了会在自定义的目 录中搜索共享库外,用户也自定义目录让gcc搜索。 搜索。 录中搜索共享库外,用户也自定义目录让 搜索 gcc main.c -o main -linc -L./ LD_LIBRARY_PATH 动态库加载时的搜索目 如果没有把inc动态库所在的路径加入到此环 录。如果没有把 动态库所在的路径加入到此环 境变量。那么linux系统运行 系统运行main程序时会提示: 程序时会提示: 境变量。那么 系统运行 程序时会提示 /usr/bin/ld: cannot find -linc
Linux
编译
调试
李杰聪 lijiecong@
程序编译过程
从程序员角度,编译源代码可以分为三个阶段。 从程序员角度,编译源代码可以分为三个阶段。预 处理源代码(宏展开 生成机器指令(*.o),链接 宏展开),生成机器指令 处理源代码 宏展开 生成机器指令 , (*.a *.so)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21
优点:
▪ 简化编译时所需要执行的命令 ▪ 编译完成后,修改某个源码文件,则make
仅会对被修改了的文件进行编译,其他的 目标文件不会被更改
▪ 最后可以依照相依性来更新执行文件
2021
22
程序自动维护工具make
目标(target):目标文件1 目标文件2 <tab> gcc -o 欲新建可执行文件 目标1 目标2 注意:命令行必须以tab按键开头
▪ 方法2:
gcc-Wall -c test1.c gcc-Wall –c test2.c gcc-Wall –c test3.c gcc –o mytest test1.o test2.o test3.o
2021
11
用gdb调试GCC程序
gdb是一个用来调试C和C++程序的常用调 试工具之一。
gdb所提供的一些功能:
2021
15
Ctrl+c 发信号量中断当前操作 Info break:显示断点信息 Delete n:去除第几号断点 Disable n:暂停使用某个断点 Enable n:启动某个暂停的断点 Break:从后向前清除断点 Continue:继续运行
2021
16
调试实例
1.在 gdb 提示符下键入 list 命令三次, 列 出源代码:(注:按回车健将重复上一个命 令)
2021
13
基本gdb命令
▪ file装入想要调试的可执行文件。 ▪ kill终止正在调试的程序。 ▪ list执行一行源代码但不进入函数内部。 ▪ next执行一行源代码但不进入函数内部。 ▪ step执行一行源代码而且进入函数内部。 ▪ run执行当前被调试的程序 ▪ quit终止 gdb ▪ watch使你能监视一个变量的值而不管它何时被改变。 ▪ break在代码里设置断点, 这将使程序执行到这里时被挂起。 ▪ make使你能不退出 gdb 就可以重新产生可执行文件。 ▪ shell使你能不离开 gdb 就执行 UNIX shell 命令。
▪ 监视程序中变量的值。 ▪ 设置断点以使程序在指定的代码行上停止
执行。
▪ 逐行执行代码。 ▪ 分析崩溃程序的产生的core文件
2021
12
gdb基本用法
需要调试的程序,在编译时要使用调试选项。 在默认的情况下,调试符号不会编译到程 序中。调试之后,不需要重新编译程序。 gdb [filename] 出现 (gdb) 在这里,可以输入调试命令
gcc –o main ${OBJS} ${LIBS} Clean:
rm –f main ${OBJS}
2021
24
变量左边不可以有<tab>,例如LIBS的左边 习惯上变量最好大写 运用变量时,以${变量}或$(变量)
2021
25
./configure:建立makefile文件,一般软件开发者写 脚本检查你linux系统相关的软件属性,安装信息 都是在该步骤完成
Make:依据makefile当中的默认工作进行编译的行 为,主要是gcc将源码文件编译成可以被执行的目 标文件,但这些目标文件通常还需要一些函数库 之类的链接后,才能生成一个完整的可执行文件, 该文件会被放置在目前所在的目录中,尚未被安 装到预定安装的目录中
2021
26
Make install:最后步骤,依据makefile中关 于install的选项,将上一个步骤编译完成的 数据安装到默认的目录中,完成安装
如果两个以上的规则,可添加 Clean:
rm –f main main.o haha.o sin_value.o cos_value.o
2021
23
Vi makefile LIBS=-lm OBJS=main.o haha.o sin_value.o
cos_value.o Main:${OBJS}
2.根据列出的源程序, 你能看到要设断点 的地方在第22行, 在 gdb 命令行提示符下键 入如下命令设置断点: (gdb) break 22
3.键入 run 命令, 继续执行
2021
17
4.设置一个观察 string2[size - i] 变量的值的 观察点来看出错误是怎样产生的, 做法是键 入:
2021
14
List 显示程序内容,一般10行 List 函数名:显示函数对应内容 List 行号:显示该行周围的源代码 Set listsize 行数:设置显示代码的行数 Show listsize :显示当前listsize的设置 List first,last:显示first和last之间的内容
gcc与gdb使用
2021
1
2021
2
2021
3
2021
4
2021
8
2021
9
2021
10
多个源文件生成一个可执行文件
问题:有多个源文件时,如何生成一个可执行文件?
▪ 方法1:gcc –Wall –o mytest test1.c test2.c
test3.c
2021
27
make 命令的使用
make [option] [macrodef] [target]
(gdb) display string2[size - i]
5.根据情况使用print命令查看表达式的值, 判断错误出现的位置,进行错误改正
2021
18
程序自动维护工具make
问题:当开发的程序非常庞大,且关系复杂, 手工编译链接非常困难
解决:
利用一个自动系统控制和协调整个程序的创 建过程。在这个自动系统中,程序员可以 定义创建规则并通过这个规则进行项目的 开发。
makefile就是定义这种规则的文件。GNU make 解释执行makefile。
2021
19
程序自动维护工具make
make是一种自动生成和维护目标程序的工具。
▪ 可以调用编译器、连接器等 ▪ 根据程序各部分的修改情况,重新编译链接目
标代码
▪ 输入make命令后,系统自动检测系统文件和以
定义的规则,完成整个创建过程
2021
20
Vi makefile
Main:main.o haha.o sin_value.o cos_value.o
gcc –o main.o haha.o sin_value.o cos_value.o –lm 使用make两次,发现成功实现可执行文件的 产生,并且自动检查文件的更新情况
2021