之前说过的GDB的强大的功能,但是GDB虽然功能强大,但文本命令的操作方式始终是一个应用上的瓶颈。那么在Linux平台上有没有一款类似于Windows平台上Visual Studio、Borland C++这样的可视化集成开发环境呢?当然是有的,目前使用最广泛的就是Eclipse。
2001年,IBM公司以源代码的方式发布了Eclipse平台,此后Eclipse得到了飞速发展。由于是采用Java语言进行编写的,所以Eclipse可以运行在包括Linux在内的多种操作系统上。
从内部结构来看,Eclipse只是一个可视化的集成开发界面,而核心编译器是以插件的形式存在的。这样的好处是不管使用哪种编译器, Eclipse都提供了统一的可视化集成开发界面。所以在Eclipse平台上能够很方便的进行C、C++、Java、PHP、Perl等多种编程语言的开发。本章介绍如何在Eclipse中使用GCC开发C程序的方法。
1 Eclipse环境安装
1.安装JDK
由于运行Eclipse需要Java虚拟机的支持,所以需要先安装JDK。从http://www.java.com网站中可以下载基于Linux平台的JDK版本(有bin和RPM自解压文件两种安装文件)。把JDK安装文件jre-6u7-linux-i586.bin文件下载到红旗Linux系统中。接着就可以运行jre-6u7-linux-i586.bin文件进行JDK的安装(其实是解包)了,如下所示。
[root@localhost home]# ./jre-6u7-linux-i586.bin
Sun Microsystems, Inc. Binary Code License Agreement
for the JAVA SE DEVELOPMENT KIT (JDK), VERSION 6
SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE
SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION
THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY
CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS
(COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT
CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE, YOU
ACCEPT THE TERMS OF THE AGREEMENT. INDICATE ACCEPTANCE BY
SELECTING THE "ACCEPT" BUTTON AT THE BOTTOM OF THE
AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY ALL THE
TERMS, SELECT THE "DECLINE" BUTTON AT THE BOTTOM OF THE
AGREEMENT AND THE DOWNLOAD OR INSTALL PROCESS WILL NOT
CONTINUE.
1. DEFINITIONS. "Software" means the identified above in
binary form, any other machine readable materials
(including, but not limited to, libraries, source files,
header files, and data files), any updates or error
corrections provided by Sun, and any user manuals,
programming guides and other documentation provided to you
--More--
可以看到当前显示的是JDK的版本和协议信息。由于协议信息比较长,所以需要按多次回车键。协议信息全部显示完毕后,系统会给出以下提示:
Do you agree to the above license terms? [yes or no]
输入yes表示同意以上协议后,JDK的安装才会继续。解压完毕后会在当前目录下产生一个文件夹jre1.6.0_07。为了遵守Linux的文件管理规范,把文件夹jre1.6.0_07转移到/usr目录下(为了方便重命名为jdk)。
为了使Linux系统能够找到JDK的安装目录,需要设置JDK的环境变量。在/etc/profile文件的末尾插入以下环境变量。
export JAVA_HOME=/usr/jdk
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
保存修改后注销Linux系统使之生效。通过命令“java -version”可以查看JDK是否能够正常工作。如下所示:
[root@localhost ~]# java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
2.安装Eclipse
首先从Eclipse的官方网站http://www.eclipse.org/downloads/中下载Eclipse IDE for C/C++ Developers(Linux 32bit)版。这是基于32位Linux平台的针对C和C++程序开发的Eclipse版本,其中已经集成了C和C++程序的开发插件。
对下载好的eclipse-cpp-ganymede-linux-gtk.tar.gz进行解压缩后会在当前目录下出现一个eclipse文件夹。进入eclipse文件夹后双击可执行文件eclipse,就可以看到Eclipse的启动画面了。
Eclipse启动时会提示输入workspace的路径,workspace是Eclipse的工作空间,所有在Eclipse中创建的程序都放置在工作空间内。本书使用的工作空间路径是/home/workspace。如图-1所示的是Eclipse启动完毕的工作界面(关闭欢迎页面后)。
图1 Eclipse工作界面
2 Eclipse C程序开发
1. 创建程序
在Eclipse中创建程序的步骤如下所示:
1) 在“File”菜单中选择新建一个“C Project”。
2) 在弹出的对话框中输入“Project name”的值,这里输入test。Eclipse默认当前工程
test的类型是可执行文件,使用的编译器是“Linux GCC”。
3) 点击“Finish”后完成test工程的创建。
4) 在“File”菜单中选择新建“Source File”。
5) 在弹出的对话框中输入“Source File”的值,这里输入“main.c”。Eclipse会默认当
前main.c文件采用的是C文件模板。
6) 点击“Finish”后就完成了main.c文件的创建。接着按照同样的方法创建cal.c文件
和cal.h头文件(选择“Header File”)。
如图-2所示的是main.c文件的源代码。cal.c和cal.h
图-2 main.c源代码
l cal.c
int cal(int n)
{
if(n == 1)
return 1;
else
return n * cal(n - 1);
}
l cal.h
#ifdef CAL_H_
#define CAL_H_
int cal(int n);
#endif /* CAL_H_ */
在输入源代码的时候可以发现,Eclipse会自动调整语句的缩进格式和括号的添加,而在文本文件中则完全是依靠手动调整的。
2. 编译程序
在Eclipse中可以选择手工生成Makefile和自动创建Makefile两种方式。下面详细介绍这两种方式。
(1)手工创建Makefile
首先新建Makefile文件,步骤如下:
1) 在“File”菜单中选择新建“Source File”。
2) 输入文件名“Makefile”。
3) 点击“Finish”完成了Makefile文件的创建。
如图-3所示的是Makefile文件的代码。
图-3 Makefile文件代码
设置使用手工创建的Makefile编译程序的步骤如下所示:
1) 在位于工作界面左侧“Project Explorer”中选中“test”。
2) 选择“Project”菜单中的“Properties”选项。在弹出的“Properties for Test_project”
对话框中选中“C/C++ Build”选项。
3) 取消Eclipse默认钩选的“Generate Makefiles automatically”。
4) 点击“Workspace”按钮选择工程的工作空间的位置。
5) 点击“Finish”完成设置。如图-4所示。
图-4 手工创建Makefile配置界面
由于一个工程可以具有多个编译目标,所以这里还需要为当前的工程创建一个编译目标。步骤如下:
1) 选择“Project”菜单中的“Make Target”。
2) 点击“Create”选项。
3) 在弹出的“Create a new Make target”对话框中分别输入“Target Name”和“Make Target”的值。其中,“Target Name”表示项目目标的名称;“Make Target”表示编译生成的目标文件名称,该名称必须和Makefile文件中的第一个目标文件的名称一致(这里都输入“test”)。
4) 点击“Create”按钮完成编译目标的创建。
编译任务创建完毕之后,就可以对test工程进行编译了。使用手工创建的Makefile编译程序的步骤如下:
1) 选择“Project”菜单中的“Make Target”选项。
2) 点击“Build”选项。
3) 在弹出的“Make Targets”对话框中会显示当前所创建的编译目标。由于当前只有一个
编译目标test,所以Eclipse会默认选中test。
4) 点击“Build”按钮后就开始对工程test进行编译了。
Eclipse会根据手工创建的Makefile文件对test工程中的源文件进行编译。在Console控制台中可以看到Make产生的编译信息。如图-5所示。
图-5 手工Makefile编译信息
编译完成之后可以通过点击“Run”菜单中的“Run”选项(或直接点击工具栏中的绿色箭头按钮)运行test文件。在Console控制台中可以看到运行结果120。
(2)自动创建Makefile
使用自动创建的Makefile编译程序大致按照以下步骤进行:
1) 在位于工作界面左侧“Project Explorer”中选中“test”。
2) 选中“Project”菜单中的“Properties”选项。
3) 在弹出的“Properties for Test_project”对话框中选中“C/C++ Build”选项。
4) 钩选“Generate Makefiles automatically”(手工创建时取消了钩选)。
5) 点击“Finish”完成设置。
接着对test工程进行编译,在Console控制台中可以看到Make使用自动创建Makefile进行编译时产生的信息。如图-6所示。
图-6 自动Makefile编译信息
运行生成的可执行文件test,其结果也是120。但是和手工创建Makefile编译方式不同,使用自动创建的Makefile编译工程时,Eclipse会默认在Debug目录下进行,这样便于对程序进行调试。
打开Debug目录,里面除了有熟悉的main.o、cal.o、test和Makefile文件外,还有一些以d和mk为后缀的文件。
(1).d文件
Make工程管理器为每一个C文件产生一个描述其依赖文件的Makefile,并以d为后缀。比如本例中的main.c就有一个main.d文件,其中描述了生成main.o所需要的C文件与头文件。旧版本的Make工程管理器使用depend文件来描述目标文件的依赖文件。
(2).mk文件
.mk文件就是子Makefile文件。在本例中,makefile文件中包含了以下三条语句。
-include sources.mk
-include subdir.mk
-include objects.mk
说明makefile中包含了sources.mk、subdir.mk和objects.mk三个子Makefile文件。
3. 调试程序
可视化集成开发环境不但方便了程序的编写,更为程序的调试提供了极大的便利。为了验证这个优点,下面以和GDB作对比的方式介绍Eclipse的调试功能。
(1)查看源文件
Eclipse默认的编码界面并没有显示代码的行数。打开行数显示的步骤如下:
1) 点击“Window”菜单中的“Preferences”选项。
2) 打开对话框左侧的“General”列表,依次点击其中的“Editors”和“Text Editors”。
3) 勾选位于对话框右侧面板中的“Show line numbers”。
4) 点击“OK”后就可以看到行号显示了。
(2)运行调试器
在“Project Explorer”中选中工程test,然后点击“Run”菜单中的“Debug”选项就可以启动调试器了。在启动过程中会提示是否打开调试器界面,选择打开便于查看调试的结果。Debug启动完毕后会自动停留在main函数内的第一行代码处(用蓝色箭头指向),等待具体的调试任务。如图-7所示。
图-7 调试界面
(3)设置断点
在Eclipse中,只要在需要设置断点的代码行旁边(左侧蓝点处)双击鼠标就可以产生一个断点(用蓝色图标指向)。采用同样的办法可以随意设置多个断点。这里在cal.c文件中的第12行处设置一个断点。如图-8所示。
图-8 断点示意图
(4)查看断点情况
在工作界面右上侧的窗口中可以看到当前设置的所有断点信息。如图-9所示。
图-9 断点信息
(5)运行程序
点击“Debug”窗口中的“Resume”绿色箭头按钮开始运行程序。程序会自动在第一个断点处暂停运行,并用绿色表示当前暂停运行的语句。如图-10所示。
图-10 断点信息
(6)查看变量值
点击工作界面右上侧窗口中的“Variable”选项就可以看到当前断点处变量n的值。如图-11所示。
图-11 变量信息
(7)继续运行程序
点击“Debug”窗口中的“Resume”按钮就可以让程序从断点处继续运行。程序依然会在cal.c文件中的第12行处暂停运行,同时可以看到“Variable”窗口中当前变量n的值变成了4。如图-12所示。
图-12 变量信息
(8)单步运行
点击“Debug”窗口中的“Step Into”黄色弯箭头按钮就可以让程序一步步的运行。如图-13(a)、(b)、(c)所示的是分别点击一次、两次和三次“Step Into”按钮后的情况:
一次:
图-13(a)单步运行第一次
两次:
图-13(b)单步运行第二次
三次:
图-13(c)单步运行第三次
这里要注意的是在“Step Into”按钮旁还有一个“Step Over”按钮。使用该按钮单步运行时不进入函数内部运行。
最后通过点击“Terminate”红色按钮终止程序调试(需返回编程界面时要关闭调试器界面)。
通过上述调试过程的介绍可以很直观地感受到Eclipse图形调试器的便利性。随着软件技术的发展,越来越多的工作都可以由开发环境代劳,程序开发人员只需要专注于程序逻辑功能的设计与实现。