Eclipse 4.4.1 (Luna) for C/C++ Programming
目录
Eclipse是一个开源的集成开发环境 (IDE)。官网在这儿。Eclipse主要用来做Java开发。它也可以通过插件的方式支持C/C++, PHP, Python, Perl, 以及其他web项目的开发。Eclipse同时也是跨平台的开发环境,可以运行在Windows, Linux和Mac OS下。
查看英文原文
Eclipse 4.4.1 (Luna)安装C/C++ Development Tool(CDT)
Step 0: 安装 MinGW GCC 或者 Cygwin GCC
想用Eclipse来做C/C++开发,首先得需要一个C/C++编译器。在Windows上,需要安装 MinGW GCC 或者 Cygwin GCC。如果不确定该选哪儿款,就选MinGW吧,因为它更轻量级,更容易安装,不过所支持的特性也就少点儿了。
- MinGW GCC: 阅读 MinGW 安装指南
- Cygwin GCC: 阅读 Cygwin 安装指南。确保在安装的时候,在 Devel(Development) 目录下选中 gcc, g++, gdb以及make 这些包,因为默认安装是没有选中这些包的。
Step 1: 安装 Eclipse C/C++ Development Tool (CDT)
有两种方式安装CDT,取决于本机上之前是不是安装过Eclipse:
如果之前安装过 Eclipse for Java Developers 或者其他的Eclipse安装包,那么你需要安装CDT插件,如下
打开 Eclipse => Help => Install New Software => 在 Work with 的下拉框的下拉菜单里选择 Luna - http://download.eclipse.org/releases/luna (或者 Eclipse 4.3 选择 Kelper; 或者 Eclipse 4.2 选择 juno; 或者 Ecplise 3.7 选择 helois)。
在 Name 复选框中展开 Programming Language => 选中 C/C++ Development Tools => 一路 Next => Finish.如果之前没有安装过任何 Eclipse,那么可以在这里下载 Eclipse IDE for C/C++ Developers,然后解压到选择的文件夹。
Step 2: 配置
只要 Cygwin 或者 MinGW 的 bin 文件夹处在系统的 PATH 环境变量中就够了,无需其他任何配置。CDT会通过搜索 PATH 找到 C/C++ 编译器。
在 Eclipse 中编写第一个 C/C++ 程序
C++ 程序
Step 0: 打开 Eclipse
- 在 Eclipse 安装目录运行 eclipse.exe
- 为你的工作空间选择合适的目录 (也就是你想把代码放在哪里)
- 如果 welcome 字样出现,点击 close 关闭
Step 1: 创建 C++ 工程
对每个C++应用来说,都需要创建一个工程来保存所有的source codes (源代码), object files (.o 文件), executable files (可执行文件) 以及 relevant resources (资源文件)。
创建 C++ 工程的步骤:- 选择 File 菜单 => New => Project… => C/C++ => C++ project
- 弹出 C++ Project 对话框 =>
在 Project name 框内输入 FirstProject =>
在 Project Types 复选框内, 选择 Executable => Empty Project =>
在 Toolchains复选框内, 选择编译器,比如 Cygwin GCC 或者 MinGW GCC => Next - 弹出 Select Configurations 对话框,选中 Debug 和 Release => Finish.
Step 2: 编写一个 Hello-world C++ 程序
- 在 Project Explorer (最左边的面板) 中 => FirstProject 右键(或者 点击 File 菜单) => New => Source File
- 弹出 New Source File 对话框
- 在 Source File 框内,输入Hello.cpp
- 点击 Finish
- 源文件 Hello.cpp 出现在了编辑面板中。输入以下代码:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, world!" << endl;
return 0;
}
-
如果发生 Unresolved Inclusion Error
-
如果出现 Unresolved Inclusion Error,说明 include paths for headers 没有设置正确。
选中 Project 菜单 ⇒ Properties ⇒ C/C++ General ⇒ Paths and Symbols ⇒ 在 Includes 选项卡中:对于 Cygwin GCC :
- Add 以下目录到 GNU C 下,$CYGWIN_HOME 是 Cygwin GCC 安装目录:
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include-fixed
- $CYGWIN_HOME\usr\include
- $CYGWIN_HOME\usr\include\w32api
- Add 以下目录到 GNU C++ 下,$CYGWIN_HOME 是 Cygwin GCC 安装目录:
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include\c++
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include\c++\i686-pc-cygwin
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include\c++\backward
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include
- $CYGWIN_HOME\lib\gcc\i686-pc-cygwin\4.5.x\include-fixed
- $CYGWIN_HOME\usr\include
- $CYGWIN_HOME\usr\include\w32api
- Add 以下目录到 GNU C 下,$CYGWIN_HOME 是 Cygwin GCC 安装目录:
对于 MinGW GCC :
- Add 以下目录到 GNU C 下,$MINGW_HOME是 MinGW GCC 安装目录:
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include
- $MINGW_HOME\include
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include-fixed
- Add 以下目录到 GNU C++ 下,$MINGW_HOME是 MinGW GCC 安装目录:
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include\c++
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include\c++\mingw32
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include\c++\backward
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include
- $MINGW_HOME\include
- $MINGW_HOME\lib\gcc\mingw32\4.6.x\include-fixed
- Add 以下目录到 GNU C 下,$MINGW_HOME是 MinGW GCC 安装目录:
注意: 为了找到头文件的路径,需要在 Cygwin 或者 MinGW 安装目录下搜索一下类似 stdio.h (C) 以及 iostream (C++)这样的头文件。
注意: 如果在 链接 (link) 时加载共享库出现 error while loading shared libraries 错误,请在 cygwin 中安装libmpfr4
Step 3: Compile/Build
在 Project Explorer (最左边的面板) 中 => FirstProject 右键(或者 点击 Project 菜单) => 选择 Build Project 编译链接整个程序 。
Step 4: Run
在 Project Explorer (最左边的面板) 中 => FirstProject 右键(或者 点击 Run 菜单) => Run As => Local C/C++ Application => (如果弹出提示, 选择 Cygwin’s gdb debugger) ⇒ 在 Console 面板,输出了结果 Hello, world!
注意: 你需要给每一个程序都创建一个C++工程。这对于玩具程序(指平时写的小程序)来说,比较烦!
C 程序
与上面的步骤相似,创建一个 C Project (而不是 C++ Project)。然后编译链接运行 Hello - world 程序 (Hello.c)。
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
C++ Program with Makefile
在之前的例子中,我们使用的是所谓的 managed-make 方式来 build 程序 (这种方式下 Eclipse 会自动生成一个 makefile)。我们也可以自己手动编写 makefile 来控制整个的构建 (build) 过程。
Step 1: 创建一个 C++ Makefile 工程
File菜单 ⇒ New ⇒ Project… ⇒ C/C++ ⇒ C++ project ⇒ Project name框内, 输入HelloCppMakefile ⇒ 在Project type框内, 选择Makefile Project, Empty Project ⇒ Toolchains框内, 选择Cygwin GCC 或者 MinGW GCC。 忽略警告信息。
Step 2: 编写一个 C++ 程序
右键一个工程 => New ⇒ Source File ⇒ 在Source file框内, 输入Hello.cpp ⇒ 输入以下代码:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, world!" << endl;
return 0;
}
Step 3: 编写Makefile
右键一个工程 => New => File => File name 框下,输入 makefile => 输入以下代码。值得注意的是,缩进必须用 Tab 而不是 Spaces
all: Hello.exe
clean:
rm Hello.o Hello.exe
Hello.exe: Hello.o
g++ -g -o Hello.exe Hello.o
Hello.o: Hello.cpp
g++ -c -g Hello.cpp
Step 4: Build 工程
右键工程 ⇒ Build Project
Step 5: Run the Program
右键工程 ⇒ Run As ⇒ Local C/C++ Application
[未完成] 为一个工程下的若干个玩具程序编写一个makefile
阅读文档
至少,你应该通过 Eclipse 的 Welcome 页面或者 Help 菜单浏览 Eclipse的 Workbench User Guide 和 C/C++ Development User Guide。这将会避免日后很多恼人的问题,节省您很多宝贵的时间。
Eclipse CDT中调试 C/C++ 程序
学会在在有图形界面的调试器中调试程序是一项很重要的技能。它会节省您非常多的时间,让您不用去猜测哪里出Bug了。
Step 0: 编写一个 C++ 程序
下面这个程序计算并打印出 n 的阶乘 (=1*2*3*…*n)。但是,这个程序有一个逻辑错误,当 n = 20 的时候会得出一个错的值 (“The Factorial of 20 is -2102132736” - 你确定?一个负数?!”)
#include <iostream>
using namespace std;
int main() {
int n = 20;
int factorial = 1;
// n! = 1*2*3...*n
for (int i = 1; i <= n; i++) {
factorial *= i;
}
cout << "The Factorial of " << n << " is " << factorial << endl;
return 0;
}
// output
The Factorial of 20 is -2102132736
我们使用使用调试器来调试这个程序。
Step 1: 设置断点
断点可以让程序在次数悬挂住而不往下执行,这样你就可以检查程序的内部状态(比如,变量的值等等)。在开始调试之前,你需要在程序中设置至少一个断点。双击编辑面板的左侧空白栏就可以打断点了。一个蓝色的小圈圈就表示断点成功设置了。
Step 2: 开始调试
右键工程 (或者点击 Run 菜单) ⇒ Debug As ⇒ Local C/C++ Application ⇒ 选择 Yes 来切换到 Debug 视图 (视图 是为了方便某个特定的开发任务,比如编辑或者调试,而对工具面板进行也定的排版)。 程序开始运行,然后在断点处暂停。
如下图所示,高亮行(蓝色箭头所指的行)表明了下一步所要执行的语句。
Step 3: 单步执行,查看变量和输出
点击 Step Over (单步执行)按钮 (或者选择 Run菜单下的 Step Over) 进行单补运行。每执行一步,检查变量的值 (在 Variable 面板里) 和程序的输出结果 (在 Console 面板里) , 如果需要的话,你可以把鼠标放在任何变量上,看一看变量的内容。
单步执行,查看变量和输出这种方式是程序调试的终极奥义 - 因为它精确显示了程序在电脑上是怎么跑的。Step 4: Breakpoint, Run-To-Line, Resume and Terminate
如前所述,断点暂停了程序的运行并且让你检查程序的内部状态。双击某行左边的空白栏就可以设置断点 (或者是在 Run 菜单下选择 Toggle Breakpoint)。
Resume 让程序继续运行,直到下一个断点,或者程序的结尾。
在一个大数量级的循环里单步执行是很耗时间的,此时你可以在循环的外面设置一个断点,然后点击 Resume 来结束循环。或者,你可以把光标放在一行特别的语句上,然后在Run 菜单点击 Run-To-Line,让程序直接运行到此行。
Terminate 按钮结束本次调试. 尽量每次都通过 Terminate 或者 Resume 到程序结尾的方式来结束本次调试。
Step 5: 切回 C/C++ 视图
点击右上角的 C/C++ 视图图标切回 C/C++ 视图 (或者 Window 菜单 ⇒ Open Perspective ⇒ C/C++).
一句话,调试很重要,去探索调试器的更多特性吧!
Other Debugger’s Features
修改变量值: 可以在 Variable 面板里输入新的值来修改变量值。在不修改源代码的情况下,这种暂时修改程序表现的方式还是很方便的。
Step-Into and Step-Return: 为了对函数进行调试, 你需要使用 Step-Into 按钮进入函数的第一个语句。也可以使用 Step-Return 按钮在函数的任何位置退出函数,返回到调用者。而且,也可以在函数内部设置断点。
注意: 如果在调试过程中,出现了Can’t find a source file at /cygdrive/c…, 那么需要在/cygdrive/c和c:/之间做一个映射 (假设你的程序在 c 盘下):
Window ⇒ Preferences ⇒ C/C++ ⇒ Debug ⇒ Common Source Lookup Path, 选中 Add ⇒ Path Mapping
Eclipse 使用技巧
请阅读 Java版本的Eclipse 使用技巧。都差不多。
使用 GCC 进行 C/C++ 开发
可以在 $workspace\.metadata\.plugins\org.eclipse.cdt.ui\global-build.log 下查看 Eclipse CDT 中用于 build工程的命令。
设置include-paths, library-paths, libraries: 当 build(构建) 一个程序的时候,编译器需要头文件来编译源文件; 链接器需要库文件来解析外部引用。编译器搜索 include-paths 来寻找
#include
指令包含的头文件。链接器搜索 library-paths 来寻找程序需要的 libraryies (库).在GCC中,include-path 会通过 -Idir 选项或者环境变量 CPATH 来指定。 library-path 会通过 -Ldir 选项或者环境变量 LIBRARY_PATH 来指定。库文件 libxxx.a 通过 -lxxx 选项来指定(小写字母 ‘l’, 没有 lib 前缀和 .a 扩展名)
在Eclipse CDT中, 你可以设置 include paths, library paths 和 libraries:
右键工程 ⇒ Properties ⇒ C/C++ General ⇒ Paths and Symbols ⇒ 在 Includes , Library Paths 和 Libraries 选项卡下,这个设置仅对选中的工程有作用。
如果想设置所有项目的 include paths 和 library paths,设置环境变量 CPATH 和 LIBRARY_PATH
选择 Window 菜单 ⇒ Preferences ⇒ C/C++ ⇒ Build ⇒ Environment.
另外, 你也可以把头文件和库文件拷贝到 系统(system) 目录下,这样你就可以不用管include-paths 和 library-paths了。
OpenGL with GLUT: 对于Cygwin, 你需要安装 gcc, g++, gdb, make (在 Devel 目录下) 以及opengl, freeglut (在 graphics 目录下). 头文件 gl.h, glu.h, glut.h 均在 $cygwin\usr\include\w32api\GL 下. 使用
#include <GL/gl__.h>
包含头文件 . 库文件 libopengl32.a, libglu32.a 以及 libglut32.a 均在 $cygwin\lib\w32api 中. 为了在链接时使用这些库,使用 -lopengl32 -lglu32 -lglut32 选项(不需要 lib 前缀 和 .a 扩展名).OpenGL with SDL: 从这里下载SDL . 选择 Development Libraries ⇒ win32 ⇒ mingw32 ⇒ Unzip. 拷贝 头文件目录 SDL (在 include 目录下)到 $cygwin\usr\include\w32api; 拷贝 lib 目录下的所有库文件到 $cygwin\lib\w32api; 拷贝运行时库文件 SDL.dll (在 bin 目录下)到 Windows/System32。在你的程序中,包含以下两个头文件:
#include \<SDL/sdl.h\>
和#include <SDL/sdl_opengl.h>
为了链接通过,添加以下两个库: -lSDL -lSDLmain.
#pragma 注释指令: pragma 注释指令, 比如, #pragma comment(lib, “opengl32.lib”), 常常用来包含特定的库 (与 -l 选项功能一样)。这个依赖具体平台的指令在 Windows机器上可用,但是在 GCC 不能用。
multiple target patterns 错误信息: GNU make ($Cygwin\bin\make.exe) 有问题. 用这个代替覆盖。
fflush(stdout): gcc的库使用了缓存的I/O (与 C 的规范一致)。只有在一个换行符只有,输出才会被写到输出流。可以使用 fflush() 函数是立刻刷新缓存,写入输出流。
工程名不应该含有 “setup”: 如果你的C/C++工程名含有 setup 这个词,那么生成的结果文件 ***setup***.exe会触发 UAC (User Authorization Control),并且需要管理员的权限来运行(这花了我好几个小时才弄清楚!可以试下把 hello.exe 改成 mysetup.exe)。
Eclipse 中的File I/O
请阅读 Java版本的Eclipse 中的File I/O。
参考资料
- Eclipse的 C/C++ Development Tool User Guide, 通过 Eclipse的 Help 菜单可以看到.
- GCC (GNU compilers) 官网 ; GCC 手册
- An Introduction to GCC