嵌入式Linux C语言程序开发工具.docx
- 文档编号:29720989
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:74
- 大小:76.29KB
嵌入式Linux C语言程序开发工具.docx
《嵌入式Linux C语言程序开发工具.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux C语言程序开发工具.docx(74页珍藏版)》请在冰豆网上搜索。
嵌入式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
GDB
GDB
gdb会自动attach上去,并调试它。
program应该在PATH环境变量中搜索到。
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb–help来查看。
下
面只列举一些比较常用的参数:
-symbols
-s
-sefile-----从指定文件中读取符号表信息,并把他用在可执行文件中。
-core
-c
-directory
-d
默认搜索路径是环境变量中PATH所定义的路径。
2、在GDB中运行程序
当以gdb
如要确认gdb是否读到源文件,可使用l或者list命令,看gdb是否能列出源代码。
在gdb中,运行程序使用r或者run命令,程序的运行,有可能需要设置下面四方面的事。
、程序的运行参数。
setargs----可指定运行时参数。
(如:
setargs1020304050)
showargs----命令可以查看设置好的运行参数。
、运行环境
path
showpaths----查看程序的运行路径。
setenvironmentvarname[=value]-----设置环境变量。
如:
setenvUSER=hchen
showenvironment[varname]-----查看环境变量
、工作目录
cd
pwd------显示当前的工作目录。
、程序的输入输出
infoterminal------显示程序用到的终端的模式,使用重定向空值程序输出。
如run>outfiletty命令可以指定写输入输出的终端设备。
如tty/dev/ttyb
3、调试已运行的程序
两种方法:
、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb
格式挂接正在运行的程序。
、先用gdb
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
比如在循环体中,可以设置breakifi=100,表示当i为100时停住程序。
查看断点时,可使用命令info命令,如下所示:
(注:
n表示断点号)
infobreakpoints[n]
infobreak[n]
设置捕捉点(catchpoint)
我们可以设置捕捉点来捕捉程序运行时的一些事件。
如:
载入共享库(动态链接库)或
是C++的一场,设置捕捉点的格式为:
catch
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 condition 还有一个比较特殊的维护命令ignore,可以指定程序运行时,忽略停止条件几次。 ignore 为停止点设定运行命令 我们可以使用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”, 当运行完这个命令后,单步跟踪会在打出代码的同时打出机器指令(也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式Linux C语言程序开发工具 嵌入式 Linux 语言 程序 开发 工具
![提示](https://static.bdocx.com/images/bang_tan.gif)