本节书摘来自异步社区《Linux 高级程序设计(第三版)》一书中的第2章,第2.1节,作者:杨宗德 , 吕光宏 , 刘雍著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第2章 Linux下C语言开发工具
Linux 高级程序设计(第三版)
Linux操作系统绝大多数的内核代码都是由C语言编写,因此,在Linux下的应用程序,特别是需要与内核进行交互的程序一般都是由C语言编写的,C++程序并不多见,例如驱动开发几乎都是由C语言编写的。因此,本书所有内容都立足于Linux下的C程序开发。本章主要介绍Linux下进行C语言程序开发所必备的工具。
本章第1节主要介绍Linux环境下常用的开发工具,包括常用的编辑器。这些编辑器类似于Windows平台下的记事本和Word工具,但比记事本的功能要强大得多,在很多方面连Word工具也不能及。不过,对于熟悉Windows操作的用户来说,字符界面会有一些不习惯,需要有一个熟悉的过程。本节主要介绍Vim编辑器、Emacs编辑器以及源代码查看工具Source Insight。
本章第2节主要介绍Linux下GCC/G++的编译环境以及GDB调试工具,GCC编译工具是目前应用最为广泛的C语言编译工具,很多Windows平台的编译器都是基于GCC开发的。GDB是Linux下最强大的调试工具,它与GCC编译器一起构成Linux下C程序开发所不可缺少的工具。本节仅介绍了这几个工具的基本使用过程,关于它们的详细介绍见本书后续章节内容。读者在学习本书时,在掌握基本工具的使用后,应该首先着眼于本书前面所介绍的文件管理方式、进程管理、线程管理以及网络编程的思想、操作系统提供的服务,当有了一定的代码量后,再利用这些工具来管理编译大量的源代码,从而提高编码效率。
2.1 常用编辑工具
Linux 高级程序设计(第三版)
2.1.1 VIM编辑器
VIM编辑器(VIM是Vi编辑器的升级(Vi Improved),专门针对程序员)是UNIX/Linux操作系统下标准的编辑器,它强大的功能不逊色于任何最新的文本编辑器。对于UNIX/Linux系统的任何版本而言,VIM编辑器都是完全相同的,因此可以在所有平台上使用。目前,绝大多数Linux系统管理人员和编程人员都选此编辑器编辑文件。
1.VIM编辑器的基本模式
VIM编辑器基本上可以分为3种模式,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),图2-1为VIM各种模式相互转换的关系图。
命令模式:控制屏幕光标的移动,进行文本的删除、复制等文字编辑工作(不使用Del键和Backspace键),以及进入插入模式和底行模式,在任何模式下要回到命令模式需按Esc键。
插入模式:只有在插入模式下,才可以输入文字。按Esc键可回到命令行模式。很多VIM编辑器使用者希望一打开VIM就可以输入内容,但这不能实现,因为刚打开的VIM编辑器处于命令模式。
底行模式:保存文件或退出VIM,同时也可以设置编辑环境和一些编译工作,如列出行号、寻找字符串等。在命令行模式下输入冒号可以进入底行模式。
部分教材中把VIM编辑器简化成两个模式,将底行模式也算作命令行模式。
2.编写hello源程序
在Shell命令提示符下输入:
[root@localhost ~]#vim hello.c //如果hell.c文件不存在,将创建,如果存在,将打开
进入图2-2所示的vim编辑器,此时为命令行模式,在此模式下输入命令a(光标后面插入)或命令i(光标前插入),进入图2-3所示的插入模式(在编辑器左下方出现“插入”字符),即可以输入内容。
在编辑界面输入所有程序代码:
#include <stdio.h>
int main(void ) //此程序仅打印helloworld!信息
{
printf(“hello,world!\n”);
exit(0);
}
如果需要快速跳转到程序的首部或尾部,在命令模式下使用按键“{”则可跳转到文档的首部,按键“}”则可跳转到文件尾部。其他命令请参阅VIM编辑器命令手册,这里不再缀叙。
如果用户在当前工作目录下具有写权限,则可以将文件保存到当前目录下。此时需要进入底行模式(按Esc键后再按冒号进入底行模式),输入以下内容:
:wq
则将文件保存(write)到当前目录(当然也可以加上路径,将其存储在别的位置)并退出(quit)VIM,前提是,在相应的路径下有写的权限。
3.定制VIM
对于Linux高级用户而言,例如程序员,希望定制VIM编辑器的属性,以方便代码的编写。VIM的配置文件为“~/.vimrc”(前面的小点为隐藏文件),VIM启动时会执行该文件。
如果当前系统没有 “~/.vimrc”文件,则可以复制一份vimrc示例文件到“~/.vimrc”。该示例文件的绝对路径可以在VIM底行模式下输入以下命令获得:
:scriptnames //查找配置文件的示例位置
在结果中找到该文件的绝对路径:
~
**1: /usr/share/****vim****/vim61/macros/vimrc**** //vimrc**示例文件
2: /usr/share/vim/vim61/syntax/syntax.vim
3: /usr/share/vim/vim61/syntax/synload.vim
……
10: /usr/share/vim/vim61/syntax/c.vim
请按 Enter键或其他命令继续
找到示例配置文件后,如下所示复制到当前工作路径下,并命名为.vimrc:
[root@localhost ~]# cp /usr/share/vim/vim63/vimrc_example.vim ~/.vimrc
如果将平时在底行模式下输入的命令直接写入到该文件,则以后使用VIM时不用再次输入这些命令。下面介绍几个常用的底行模式命令。
(1)程序代码常用的缩进风格在VIM中可以使用缩进命令实现自动缩进。此缩进命令会根据关键字自动识别。例如,if….else结构,它的实现方式如下:
if (n < 0)
{
//Do something
}
else
{
//Do else something
}
设置缩进命令:
:set smartindent //设置缩进
或
:set cindent shiftwidth=4 //C语言自动缩进,缩进值为4个字符宽度
:set ts=4
(2)显示光标行列信息。在VIM的右下角有一个数值会根据光标的移动而变化,如果在默认方式下此项功能没有开启,请输入命令:
:set ruler //显示光标
(3)查看制表符。如果需要查看制表符,需要使用以下命令:
:set list //显示制表符
(4)查看行数信息。如果需要显示文件内容具体行数,则输入以下命令:
:set number //显示行号
(5)关键字高亮。程序的关键字太多,要想准确记住每一个是比较困难的。VIM提供的语法高亮显示可以帮助使用者正确输入。
:syntax on //关键字高亮
(6)多文件编辑。在编写程序时可能需要同时编辑多个文件,在这种情况下,需要对VIM的显示窗口进行分割。
:split two.c //多文件编辑
如果不输入文件名的话,分割的窗口中显示的文件将是分割前编辑的文件,使用“Ctrl+W”可以在不同的窗口间进行切换。使用vspilt命令可以垂直分割VIM窗口。
读者可以将这些命令编辑到配置文件中,以便下次启动VIM编辑器时直接完成这些设置。
2.1.2 Emacs编辑器
Emacs程序的最初版本是RichardStallman在1975年写成的,之后其衍生版本众多。目前使用最多的两个版本是RichardStallman在1984年开发的GNUEmacs和JamieZawinski在1991年开发的XEmacs。
当安装了Emacs后,在shell提示符下输入:
[root@localhost ~]# emacs sample
即可打开图2-4所示的Emacs编辑器编辑界面。在此界面中,可以将Emacs作为一个文本编辑器,输入文本信息。同样,Emacs编辑器也支持很多编辑命令,表2-1列出了部分基本命令。
Emacs特别适合编辑程序,包括任何类型的计算机语言程序。它提供了语法加亮、自动缩进等功能。一些扩展命令可以让用户很方便浏览代码,它们可以识别代码的语义,列出函数名、函数的参数和类型、变量名、类、宏、方法、define和include 的文件。编辑程序时,Emacs可以提供补全函数名、参数等功能。
2.1.3 Source Insight工具
Source Insight是一个图形化的源代码查看工具(当然也可以作为编辑工具)。如果一个项目的源代码较多,此工具可以很方便地查找出源代码之间的依赖关系,例如,某一个宏的定义位置,某一个自定义的数据类型的原始定义。读者可以通过网络下载此工具。
读者可以使用Source Insight工具将应用编程所用的头文件(主要位于/usr/include目录下)下载到Windows平台,建立各文件间的关联,从而可以便捷地查阅Linux各数据类型的定义原型。在Linux系统下类似的工具为kscope。
1.创建工程
图2-5所示是某嵌入式操作系统源代码文件列表,文件内容较多,如果逐个打开文件查看源代码,显然不便于查找。下面介绍如何创建一个项目以方便查看这个操作系统的源代码。
(1)如图2-6所示,打开Source Insight新建项目,单击菜单命令“Project-New Project”,打开如图2-7所示的新建项目对话框(如果要关闭已经打开的项目可以单击菜单命令“Project-Close Project”)。
(2)在图2-7所示对话框的“New project name”文本框中输入项目名(本例中为ucosII),在下面的文本框中输入项目文件的存储位置(或者单击右侧的“Browse”按钮选择),然后单击“OK”按钮打开图2-8所示的对话框。
(3)在图2-8所示对话框中部的文本框内输入源代码文件的位置(本例为“E:Source”),其他保存默认设置,单击“OK”按钮打开如图2-9所示的对话框。
(4)图2-9所示对话框的左侧列出了源代码目录,右侧列出该目录下的文件。如果选择的目录正确,则选中要添加的文件,单击“Add”按钮将该文件添加到项目中;如果要添加当前目录下所有文件,单击“Add All”按钮即可完成操作;如果要添加当前文件夹下包括子目录所有文件,单击“Add Tree”按钮即可。
(5)完成添加后,对话框下侧将列出所有添加的文件如图2-10所示。
(6)完成所有文件添加操作后,单击“Close”按钮返回如图2-11所示的界面,将在工作面板右侧列出所有已经添加的文件(如果没有,单击菜单命令“View-Project Windows”打开该面板),双击任何一个文件,将在左侧列出该文件的内容。
(7)在完成添加操作后,如图2-12所示,单击菜单命令“Project-Synchronize”将关联各文件。如果要重新添加新文件或者删除某个文件,单击如图2-13所示的菜单命令“Project-Add and Remove Project Files”,打开图2-10所示对话框重新添加删除文件。
2.查看功能
如果要查看某个函数、宏、变量的定义关联,可将光标放置在欲查找的关键字位置,此时,如图2-14所示,在下方将自动显示该关键字的定义,如果要继续追溯,双击下方显示内容,将跳转到该文件,从而可以继续查找。
3.搜索功能
如图2-15所示,如果要在当前项目中搜索某个关键字出现的位置,单击菜单命令“Search-Search Project”将打开如图2-16所示的搜索对话。
在图2-16所示对话框的“Find Keywords”文本框中输入要搜索的关键字,在整个项目中搜索,其他保持默认设置。单击按钮“Search”将返回如图2-17所示内容,当然,要求确实存在该关键字相关的内容。
如图2-17所示,将光标放置在匹配的行上,在界面下侧将列出该行所在文件内容,双击下方匹配内容,将跳转到该文件。