第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 【Linux】Linux编程基础(vi gcc gdb)

【Linux】Linux编程基础(vi gcc gdb)

时间:2023-04-12 05:52:26

相关推荐

【Linux】Linux编程基础(vi gcc gdb)

编写一个程序,首先是程序的录入,然后是程序的编译,最后是程序的调试。本文介绍进行这三步工作的主要工具:vi、gcc、gdb。

编辑器介绍

Linux提供了一个完整的编辑器家族系列。按功能可以分为两大类:行编辑器(Ed、Ex)和全屏幕编辑器(vi、Emacs)。行编辑器每次只能队一行进行操作,而全屏幕编辑器可以对整个屏幕进行编辑。

vi介绍

vi是全屏幕编辑器中的一种,它有三种模式,分别为命令行模式、插入模式、底行模式。

命令行模式:在使用vi编辑器编辑文件时,最初进入的是一般命令行模式。在该模式下,用户可以通过上下移动光标进行删除字符或整行删除等操作,也可以进行复制、粘贴等操作,但无法编辑文字;插入模式:在该模式下,用户才能进行文字的编辑输入,可以通过ESC键回到命令行模式;底行模式:在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,例如寻找字符串、列出行号等。

vi的各模式功能键

命令行模式下的常见功能键:

插入模式下的功能键只有1个,按ESC键返回命令行模式。

在命令行模式下,按“Shift+:”进入底行模式。底行模式下常见功能键:

其实经过试验,在命令行模式下,就不要用鼠标,所有的东西都通过命令来完成。如果不是vi命令行模式下的功能键,会使vi进入到插入模式。

程序编译与调试

嵌入式系统开发常用的编译工具是gcc,调试工具是gdb,下面一一介绍。

gcc是GNU项目中符合ANSIC标准的编译工具,能够编译由C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合嵌入式领域的开发编译。

下表示gcc支持编译的源文件的后缀名及其解释:

gcc编译流程

gcc的编译流程分为四个步骤:预处理->编译->汇编->链接。

预处理阶段:编译器将.c代码的stdio.h编译进来,并且用户可以使用gcc的选项“-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程;编译阶段:在编译阶段中,gcc首先要检查代码的规范性以及是否有语法错误等,已确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项进行查看,该选项只进行编译而不进行汇编,生成汇编代码;汇编阶段:汇编阶段是把编译阶段生成的“.s”文件转换成目标文件,用户可使用选项“-c”查看汇编代码转化的后缀名为“.o”的二进制目标代码;链接阶段:编译成功后,就进入了链接阶段。库函数一般分为静态库和动态库两种。

静态库和动态库的区别:

静态库在编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时就再也不需要库文件了,其后缀名一般为“.a”;动态库在编译链接时并没有把库函数的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,动态库的后缀名一般为“.so”。

gcc在编译时,默认使用动态库。

gcc编译选项分析

gcc有100多个可用选项,主要包括总体选项、告警和出错选项、优化选项和系统结构相关选项。下面对每一类中最常用的选项进行介绍。

gcc可以对代码进行优化,它通过编译选项“-On”控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是0-2或0-3。

不同的优化级别对应不同的优化处理工作。例如:优化选项“-O1”主要进行线程跳转和延迟退栈两种优化;优化选项“-O2”除了完成所有的“-O1”级别的优化之外,还要进行一些额外的调整工作,例如处理器指令调度等;优化选项“-O3”则还包括循环开展和其他一些与处理器特性相关的优化工作。

gcc指令的一般格式为:

gcc [选项] 要编译的文件 [选项] [目标文件]

例如:

gcc hello.c -o hello //将hello.c生成可执行文件(链接动态库)gcc -static hello.c -o hello //将hello.c生成可执行文件(链接静态库)gcc -E hello.c -o hello.i//将hello.c只进行预处理,不做其他处理gcc -S hello.i -o hello.s//将hello.i只编译不汇编,生成汇编代码gcc -c hello.s -o hello.o//将hello.s只编译不链接gcc hello.o -o hello //将hello.o链接到函数库,生成可执行文件

[root@localhost ~]# ./filename//执行可执行文件filename[root@localhost ~]# cat filename//将文件filename内容输出到标准输出设备(屏幕)上

这里区分一些gcc和g++:

gcc和g++都是GNU(一个组织)的编译器。

对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序;对于.cpp后缀的文件,gcc和g++都会当做c++程序;编译阶段,g++会调用gcc(也就是说);连接阶段,通常会用g++来完成,这是因为gcc命令不能自动和c++程序使用的库连接。

也就是说:

gcc可以用来编译c++但是它不会自动调用链接的c++库,需要自己手动链接,使用如下命令: gcc -lstdc++ main.cpp;g++则会自动调用链接的c++库,使用的也是gcc命令。但是gcc在编译c程序的时候,它会自动链接c库的。gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译;但是g++无论是.c或.cpp都统一按c++程序来编译。而且g++在编译的过程中,其实是调用gcc按照c++程序来编译的。即编译工作最终都是由gcc来完成的。

gdb程序调试

gdb作为GNU开发组织发布的一个UNIX/LINUX下的程序调试工具,提供了强大的调试功能。

由于gdb的目录很复杂,所以就先留个空,以后学习的时候来补。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。