嵌入式Linux C语言程序开发工具.docx

上传人:b****5 文档编号:29720989 上传时间:2023-07-26 格式:DOCX 页数:74 大小:76.29KB
下载 相关 举报
嵌入式Linux C语言程序开发工具.docx_第1页
第1页 / 共74页
嵌入式Linux C语言程序开发工具.docx_第2页
第2页 / 共74页
嵌入式Linux C语言程序开发工具.docx_第3页
第3页 / 共74页
嵌入式Linux C语言程序开发工具.docx_第4页
第4页 / 共74页
嵌入式Linux C语言程序开发工具.docx_第5页
第5页 / 共74页
点击查看更多>>
下载资源
资源描述

嵌入式Linux C语言程序开发工具.docx

《嵌入式Linux C语言程序开发工具.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux C语言程序开发工具.docx(74页珍藏版)》请在冰豆网上搜索。

嵌入式Linux C语言程序开发工具.docx

嵌入式LinuxC语言程序开发工具

目录

嵌入式LinuxC语言程序开发工具1

一、编辑器vim1

1、vim的三种工作模式1

二、编译器GCC4

2、GCC基本规则4

3、GCC的执行过程4

4、GCC的基本用法5

5、程序实例5

三、调试器GDB7

1、启动GDB的方法7

2、在GDB中运行程序7

3、调试已运行的程序8

4、暂停/恢复程序运行8

5、一些指令12

6、程序实例14

四、make功能管理器17

1、make的概述17

2、Makefile的基本结构17

3、makefile变量18

4、make的规则23

5、简单的示例25

五、Shell编程27

1、shell基础知识27

2.shell变量30

3.ShellScript编程32

六、autotools的简介-----------------------------------------------47

嵌入式LinuxC语言程序开发工具

一、编辑器vim

1、vim的三种工作模式

命令模式

当输入vi命令进入编辑器时,就处于命令模式。

此时,从键盘输入任何字符都被当作编辑命令来解释。

如a表示附加命令,i表示插入命令,x表示删除命令,如果不是vi的合法命令,会机器会发出报警声。

命令模式可以通过命令来完成光标的定位,字符串的检索,文本恢复,修改,替换,标记,行结合及文本位移等功能。

/word------向游标之下寻找一个名为word的字符串。

Word-----向游标之上寻找一个名为word的字符串。

[Ctrl]+r---重做上一个动作。

U----------复原前一个动作。

Ndd--------删除游标所在n整列。

.(小数点)--重做上一个动作。

在命令模式下(CommandMode)按a/A键、i/I键、o/O键进入文本模式,文本输入模式的命令及其含义如下所示。

a-----在光标后开始插入

A-----在行尾开始插入

i-----从光标所在位置前面开始插入

I-----从光标所在列的第一个非空白字元前面开始插入

o-----在光标所在列下新增一列并进入输入模式

O-----在光标所在列上方新增一列并进入输入模式

ESC----返回命令行模式

插入模式

插入模式也叫输入模式,可以通过输入vi插入命令i,附加命令a,打开命令o,替换命令s,修改命令e或取代命令r从命令模式进入插入模式。

在插入模式下,从键盘上输入的所有字符都被插入到正在编辑的缓冲区,被当作该文件的正文,相当于windows下的“记事本”。

按ESC键退出插入模式。

插入模式主要使用方向键移动光标位置进行文字的编辑,下面列出了常用的操作命令及含义。

0-----光标移动至行首

h-----光标左移一格

l-----光标右移一格

j-----光标下移一行

k-----光标上移一行

$+A-----将光标移动到该行最后

PageDn---向下移动一页

PageUp---向上移动一页

d+方向键--删除文字

dd-----删除整行

pp-----整行复制

r-----修改光标所在的字符

S-----删除光标所在的列,并进入输入模式

底行命令模式

要执行底行命令模式,必须在命令模式下输入一个冒号“:

”。

底行命令模式主要完成文本的全局替换,文本中插入shell命令,vi编辑器的设置,文本的存盘退出,文本块的复制,多个文本间的转换及缓冲区的操作功能。

底行模式主要进行一些文字编辑辅助功能,比如字串搜索、替代、保存文件等操作。

主要命令如下

q-----结束Vi程序,如果文件有过修改,先保存文件

q!

----强制退出Vi程序

wq----保存修改并退出程序

setnu---设置行号

w----------将编辑的资料写入硬碟中。

w!

----------如果文件属性为只读时,强制写入该文件。

但是是否能写入取决于用户的使用权限。

ZZ(大写)----若文件没有改动则直接退出,若文件有改动则保存并退出。

w[文件名]---将编辑完的文件另存一个文件。

r[文件名]----在编辑的文件中,读入另一个文件的资料。

即将这个资料加载到游标所在行下面

n1n2[filename]----将n1、n2这两个文件的内容储存在filename文件中。

三种模式之间的转换

vi编辑器的三种工作模式文成不同的功能:

只有在输入模式下才能完成文本的输入工作,只有在命令模式下才能完成效率较高的文本的修改、恢复及检索定位等工作;只有在底行命令模式才能进行编辑器的设置,字符串的全局替换、文本的存储及退出等工作。

三种模式之间的转换如图:

 

二、编译器GCC

1、GCC发展历史

  GCC是GNU公社的一个项目。

是一个用于编程开发的自由编译器。

最初,GCC只是一个C语言编译器,他是GNUCCompiler的英文缩写。

随着众多自由开发者的加入和GCC自身的发展,如今的GCC已经是一个包含众多语言的编译器了。

其中包括C,C++,Ada,ObjectC和Java等。

所以,GCC也由原来的GNUCCompiler变为GNUCompilerCollection。

也就是GNU编译器家族的意思。

当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。

  直到现在,GCC的历史仍然在继续,他的传奇仍然被人所传颂。

2、GCC基本规则

  .c为后缀的文件,C语言源代码文件;

  .a为后缀的文件,是由目标文件构成的档案库文件;

  .C,.cc或.cxx为后缀的文件,是C++源代码文件;

  .h为后缀的文件,是程序所包含的头文件;

  .i为后缀的文件,是已经预处理过的C源代码文件;

  .ii为后缀的文件,是已经预处理过的C++源代码文件;

  .m为后缀的文件,是Objective-C源代码文件;

  .o为后缀的文件,是编译后的目标文件;

  .s为后缀的文件,是汇编语言源代码文件;

  .S为后缀的文件,是经过预编译的汇编语言源代码文件。

3、GCC的执行过程

预处理,生成.i的文件[预处理器cpp]

将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]

有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]

连接目标代码,生成可执行程序[链接器ld]

  命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。

汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。

在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

4、GCC的基本用法

  在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。

Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

  Gcc最基本的用法是∶gcc[options][filenames]

  其中options就是编译器所需要的参数,filenames给出相关的文件名称。

  -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

  -ooutput_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。

如果不给出这个选项,gcc就给出预设的可执行文件a.out。

  -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

  -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

  -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。

C程序中的头文件包含两种情况∶

A)#include

B)#include“myinc.h”

其中,A类使用尖括号(<>),B类使用双引号(“”)。

对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。

5、程序实例

示例代码a.c:

#include

intmain()

{

printf("hello\n");

}

预编译过程

这个过程处理宏定义和include,并做语法检查。

可以看到预编译后,代码从5行扩展到了910行。

gcc-Ea.c-oa.i

cata.c|wc-l

5

cata.i|wc-l

910

编译过程

这个阶段,生成汇编代码。

gcc-Sa.i-oa.s

cata.s|wc-l

59

汇编过程:

这个阶段,生成目标代码。

此过程生成ELF格式的目标代码。

asa.s-oa.o

filea.o

a.o:

ELF64-bitLSBrelocatable,AMDx86-64,version1(SYSV),notstripped

链接过程:

链接过程。

生成可执行代码。

链接分为两种,一种是静态链接,另外一种是动态链接。

使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。

使用动态链接的好处是,生成的程序比较小,占用较少的内存。

gcca.o-oa

程序运行:

./a

hello

GCC编译简单例子

编写如下代码:

#include

intmain()

{

printf("hello,world!

\n");

}

执行情况如下:

wenjun@ubuntu:

~/temp/01$gcchello.c-ohello

wenjun@ubuntu:

~/temp/01$ls

hellohello.c

wenjun@ubuntu:

~/temp/01$./hello

hello,world!

3、调试器GDB

一般来说,GDB主要帮助你完成下面四个方面的功能

、启动你的程序,可以按照你自定义的要求随心所欲的运行程序。

、可以让调试程序在你所指定的位置的断点处停止。

、当程序停止时,可以检查此时你的程序中所发生的事情。

、动态的改变你程序的执行环境。

1、启动GDB的方法

GDB-----program也就是你的执行文件,一般在当前目录下。

GDBcore----用GDB同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件。

GDB-----如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。

gdb会自动attach上去,并调试它。

program应该在PATH环境变量中搜索到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb–help来查看。

面只列举一些比较常用的参数:

-symbols

-s----从指定文件中读取符号表。

-sefile-----从指定文件中读取符号表信息,并把他用在可执行文件中。

-core

-c----调试coredump的core文件。

-directory

-d----加入一个源文件的搜索路径。

默认搜索路径是环境变量中PATH所定义的路径。

2、在GDB中运行程序

当以gdb方式启动gdb后,gdb会在PATH路径和当前目录中所搜的源文件。

如要确认gdb是否读到源文件,可使用l或者list命令,看gdb是否能列出源代码。

在gdb中,运行程序使用r或者run命令,程序的运行,有可能需要设置下面四方面的事。

、程序的运行参数。

setargs----可指定运行时参数。

(如:

setargs1020304050)

showargs----命令可以查看设置好的运行参数。

、运行环境

path

-----可设定程序的运行路径。

showpaths----查看程序的运行路径。

setenvironmentvarname[=value]-----设置环境变量。

如:

setenvUSER=hchen

showenvironment[varname]-----查看环境变量

、工作目录

cd

-----相当于shell的cd命令。

pwd------显示当前的工作目录。

、程序的输入输出

infoterminal------显示程序用到的终端的模式,使用重定向空值程序输出。

如run>outfiletty命令可以指定写输入输出的终端设备。

如tty/dev/ttyb

3、调试已运行的程序

两种方法:

、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdbPID

格式挂接正在运行的程序。

、先用gdb关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的

PID,并用detach来取消挂接的程序。

4、暂停/恢复程序运行

调试程序中,暂停进程运行时必须的,GDB可以方便的暂停程序的运行。

你可以设置程

序在哪停住,在什么条件下停住,在收到什么信号时停住等等。

你便于你查看运行的变量,

以及运行时的流程。

当进程被gdb停住时,你可以使用infoprogram来查看程序是否在运行、进程号、被暂停的原因。

在gdb中,我们可以有以下几种暂停方式:

断点(breakpoint)、观察点(watchpoint)、捕捉点(catchpoint)、信号(signals)、线程停止(threadstops)。

如果要恢复程序运行,可以使用c或者continue命令。

设置断点(breakpoint)

我们用break命令设置断点。

下面有几点设置断点的方法:

break-----在进入指定函数时停住。

C++中可以使用class:

:

function或function(type,type)格式来指定函数名。

break-------在指定行号停住。

break+offset

break–offset-------在当前行号的前面或者后面的offset行停住。

Offset为自然数。

breakfilename:

linenum--------在源文件filename的linenum行处停住。

breakfilename:

function--------在源文件filename的function函数的入口处停住。

break*address-------在程序运行的内存地址处停住。

Break---------break命令没有参数时,表示在下一条指令处停住。

break…if---------…可以是上述的参数,condition表示条件,在条件成立时停住。

比如在循环体中,可以设置breakifi=100,表示当i为100时停住程序。

查看断点时,可使用命令info命令,如下所示:

(注:

n表示断点号)

infobreakpoints[n]

infobreak[n]

设置捕捉点(catchpoint)

我们可以设置捕捉点来捕捉程序运行时的一些事件。

如:

载入共享库(动态链接库)或

是C++的一场,设置捕捉点的格式为:

catch------当event发生时,停住程序。

Event可以是下面的内容:

1、throw一个C++抛出的异常(throw为关键字),

2、catch一个C++捕捉到的异常(catch为关键字),

3、exec调用系统调用exec时(exec为关键字,目前此功能只在HP-UX下有用)

4、fork调用系统调用fork时。

(fork为关键字,目前此功能只在HP-UX下有用)

5、vfork调用系统调用vfork时。

(vfork为关键字,目前此功能只在HP-UX下

有用)

6、load或load载入共享库(动态链接库)时。

(load为关键字,

目前此功能只在HP-UX下有用)

7、unload或unload卸载共享库(动态链接库)时。

(unload为关

键字,目前此功能只在HP-UX下有用)

tcatch

只设置一次捕捉,当程序停住后,断点被自动删除。

维护停止点

上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。

在GDB中,如

果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进程维护。

Clear----清楚所有已定义的停止点。

clear

clear

function>------清楚所有设置在函数上的停止点。

clear

clear

linenum>---------清楚所有设定在指定行上的停止。

delete[breakpoints][range…]---------删除指定的断点,breakpoints为断点号。

如果不指定断点号,则表示删除所有的断点。

range表示断点号的范围(如2-7),其简写命令为d。

比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,

当你还需要时,enable即可,就好像回收站一样。

enable[breakpoints][range…]------enable所指定的停止点,breakpoints为停止号。

enable[breakpoints]oncerange--------enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。

enable[breakpoints]deleterange------enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。

停止条件维护

前面在说到设置断点时,我们提到过可设置一个条件,当条件成立时,程序自动停止,

这是一个非常强大的功能,这里,专门说说这个条件相关维护命令。

一般来说,为断点设

置一个条件,我们使用if关键字,后面跟其断点条件。

并且条件设置好后,我们可以用

condition命令来修改断点的条件(只有break和watch命令支持if,catch目前暂不支持if)

condition--------修改断点号为bnum的停止条件为expression

condition------清除断点号为bnum的停止条件。

还有一个比较特殊的维护命令ignore,可以指定程序运行时,忽略停止条件几次。

ignore------表示忽略断点号为bnum的停止条件count次。

为停止点设定运行命令

我们可以使用GDB提供的command命令来设置停止点的运行命令。

也就是说,当运行

的程序在被停止住时,我们可以让你自动运行一些别的命令,这很有利于自动化调试。

给予GDB的自动化调试是一个很强大的支持。

command[bnum]

…command–list…

end

为断点号bnum指定一个命令列表。

当程序被该断点停住时,gdb会依次运行命

令列表中的命令。

例如:

breakfooifx>0

commands

printf“xis%d\n”,x

continue

End

断点设置在函数foo中,断点条件是x>0,如果程序符合条件被停住后,也就是,一旦

x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。

如果要清楚断点上的命令序列,那么只要简单的执行以下commands命令,并直接再打

个end就行了。

恢复程序运行和单步调试

当程序被停住后,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点的到来。

也可以使用step或next命令单步跟踪程序。

continue[ignore-count]

c[ignore-count]

fg[ignore-count]

恢复程序运行,直到程序结束,或是下一个断点到来。

Ignore-count表示忽略其后的断

点次数。

continue,c,fg三个命令都是一样的意思。

step

单步跟踪,如果有函数调用,他会进入该函数。

进入函数的前提是,次函数

被编译有debug信息。

像VC等工具中的stepin。

后面可以加count,也可以

不加,不加表示一条一条地执行,加表示执行后面的count条指令,然后再停住。

next

同样单步跟踪,如果有函数调用,他不会进入函数。

想VC等工具中的step

over。

后面可以加count,也可以不加。

不加表示一条条的执行,加表示执行后

面的count指令,然后再停住。

setstep-mode

setstep-modeon

打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug

信息而不停住。

这个参数很有利于查看机器码。

setstep-modeoff

运行程序,直到当前函数完成返回。

并打印函数返回时的堆栈地址和返回值

及参数值信息。

finish

运行程序,直到当前函数完成返回。

并打印函数返回时的堆栈地址和返回值

及参数值信心。

until或u

当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序知道退出循

环体。

stepi或si

nexti或ni

单步跟踪一条机器指令!

一条程序代码有可能由数条机器指令完成,stepi和

nexti可以单步执行机器指令。

与之一样有相同功能的命令式“display/I$pc”,

当运行完这个命令后,单步跟踪会在打出代码的同时打出机器指令(也

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1