您的位置:首页 > 编程语言 > C语言/C++

Eclipse 平台进行 C/C++ 开发

2013-08-21 00:58 375 查看

Eclipse 平台进行 C/C++ 开发

简介: 我们将概述如何在 C/C++ 开发项目中使用 Eclipse 平台。尽管 Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持。在本文中,您将学习如何使用 C/C++ 开发工具箱(C/C++ Development Toolkit,CDT),它是可用于 Eclipse 的最佳 C/C++ 工具箱。

本文的标签: c, cpp, eclipse, ecllipse, linux, 用eclipse平台进行c_c__开发

--------------------------------------------------------------------------------------------------------------------------------------------------------------

C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台(Eclipse Platform)提供对 C/C++ 开发的支持一点都不足为奇。 因为 Eclipse 平台只是用于开发者工具的一个框架,它不直接支持 C/C++;它使用外部插件来提供支持。 本文将向您演示如何使用 CDT — 用于 C/C++ 开发的一组插件。CDT 项目(有关链接, 请参阅本文后面的 参考资料一节)致力于为
Eclipse 平台提供功能完全的 C/C++ 集成开发环境(Integrated Development Environment,IDE)。 虽然该项目的重点是 Linux,但它在可使用 GNU 开发者工具的所有环境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)中都能工作。

CDT 是完全用 Java 实现的开放源码项目(根据 Common Public License 特许的),它作为 Eclipse SDK 平台的一组插件。这些插件将 C/C++ 透视图添加到 Eclipse 工作台(Workbench)中, 现在后者可以用许多视图和向导以及高级编辑和调试支持来支持 C/C++ 开发。

由于其复杂性,CDT 被分成几个组件,它们都采用独立插件的形式。 每个组件都作为一个独立自主的项目进行运作,有它自己的一组提交者、错误类别和邮件列表。 但是,所有插件都是 CDT 正常工作所必需的。 下面是 CDT 插件/组件的完整列表:

主 CDT 插件(Primary CDT plug-in)是“框架”CDT 插件。

CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能组件(Feature Component)。

CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心组件(Core Component)。

CDT UI是核心 UI、视图、编辑器和向导。

CDT 启动(CDT Launch)为诸如编译器和调试器之类的外部工具提供了启动机制。

CDT 调试核心(CDT Debug Core)提供了调试功能。

CDT 调试 UI(CDT Debug UI)为 CDT 调试编辑器、视图和向导提供了用户界面。

CDT 调试 MI(CDT Debug MI)是用于与 MI 兼容的调试器的应用程序连接器。

现在,让我们研究一下如何在实际应用程序中使用这些组件。图 1 显示了 Eclipse 中的 C/C++ 项目:

图 1. 在带有 CDT 插件的 Eclipse 中编辑 C/C++ 项目



安装和运行 CDT

在下载和安装 CDT 之前,首先必需确保 GNU C 编译器(GNU C compiler,GCC)以及所有附带的工具(make、binutil 和 GDB)都是可用的。 如果正在运行 Linux,只要通过使用适用于您分发版的软件包管理器来安装开发软件包。 在 Windows平台上,将需要安装 Cygwin 工具箱(请参阅 参考资料以获得链接)。Cygwin
是用于 Windows 的类 UNIX 环境,它包括 GCC 移植以及所有必需的开发工具,包括 automake 和 GNU 调试器(GNU Debugger,GDB)。Cygwin 是在
cygwin1.dll
库基础上构建的。Cygwin 的备用解决方案是 Minimalist GNU for Windows(MinGW)(请参阅 参考资料以获得链接)。
该工具是一组可免费获取、自由分发的特定于 Windows 的头文件和导入库,这些头文件和导入库与 GNU 工具集(它们允许您生成不依赖于任何第三方 DLL 的本机 Windows 程序)结合在一起。 如果您想要创建与 POSIX 兼容的 Windows 应用程序,那么 MinGW 是最佳选择。MinGW 甚至可以在 Cygwin 安装之上工作。 Solaris和 QNX要求您从因特网下载并安装其特定的 GCC、GNU Make binutils 和 GDB 移植(请参阅 参考资料以获得链接)。

假设您安装了适当的 Java SDK/JRE 和 Eclipse 平台 SDK,并且它们都正常运行。CDT 以两种“方式”可用:稳定的发行版和试运行版(nightly build)。 试运行版未经完全测试,但它们提供了更多的功能并改正了当前错误。 安装之前,请检查磁盘上是否存在先前版本的 CDT,如果存在,请确保完全除去它。 因为 CDT 没有可用的卸载程序,所以需要手工除去它。 为了检查先前版本是否存在,转至 CDT 插件所驻留的目录:
eclipse/plugins

接着,除去所有以
org.eclipse.cdt
名称开头的目录。需要做的最后一件事情是从
workspace/.metadata/.plugins
features
除去
CDT 元数据目录
or.eclipse.cdt.*


下一步是下载 CDT 二进制文件。注意:请下载适合于您操作系统的正确的 CDT。遗憾的是,即使 CDT 是用 Java 编写的,它也不是与平台无关的。 接着,将归档文件解压到临时目录中,从临时目录将所有插件目录内容都移到 Eclipse
plugins
子目录。还需要将
features
目录内容移到
Eclipse
features
子目录中。现在,重新启动 Eclipse。Eclipse 再次启动之后, 更新管理器将告诉您它发现了更改并询问您是否确认这些更改。 现在您将能够看到两个可用的新项目:C 和 C++。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

创建新项目

在 Eclipse 中安装 CDT 之后, 浏览至 File => New => Project,在那里,您将发现三个新的可用项目类型:C(“Standard C Make Project”)、C++(“Standard C++ Make Project”)和“Convert to C or C++ Projects”。 从“Standard Make C++ Project”开始,为您的项目创建源代码文件。在 C/C++ Projects 视图中,单击鼠标右键,然后选择 New
=> Simple => File
。命名您的文件并保存它。您可能会用这种方法创建许多头文件以及 C/C++ 实现代码文件。 最后当然是 Makefile,GNU Make 将使用它来构建二进制文件。对该 Makefile 使用常见的 GNU make 语法(请参阅 参考资料)。
请记住:Makefile 要求您使用 Tab 字符而不是空格来产生缩进行。

您通常会将现有的源代码导入 Eclipse(请参阅图 2)。CDT 为执行这一操作提供了一种便捷的方法:即使用 Import 向导,将文件从文件系统目录复制到工作台。转至主菜单栏,选择 File => Import => File System。单击 Next,打开源目录,选择您想要添加文件的目录。 单击 Select All 以选择目录中的所有资源,然后从头到尾检查,取消选择您不打算添加的那些资源。 指定将作为导入目标的工作台项目或文件夹。还可以通过从文件系统拖动文件夹和文件并将它们放入
Navigator 视图中, 或者通过复制和粘贴来导入文件夹和文件。

图 2. 将现有的源代码导入 CDT 项目



--------------------------------------------------------------------------------------------------------------------------------------------------------------

关键的 CDT IDE 功能

CDT IDE 是在 CDT UI 插件所提供的通用可扩展编辑器基础上构建的。然而,该模块仍处于开发阶段,所以它仍缺少一些重要的实用程序, 如类浏览器或语言文档浏览器。CDT IDE 的主要功能是:

语法突出显示:CDT IDE 识别 C/C++ 语法,并为语法突出显示提供了完全可配置的代码着色以及代码格式化功能:

图 3. 不成功的编译之后突出显示的语法错误标记



提纲:Outline 窗口模块提供了有关出现在源代码中的过程、变量、声明以及函数的快速视图。 利用 outline,您可以方便地找到源代码中的适当引用,或者甚至搜索所有项目源代码。

代码辅助:这个代码完成功能类似于可在 Borland C++ Builder 或 MS Visual Studio 中找到的功能。 它使用了 代码模板,并且只有助于避免愚蠢的语法错误:

图 4. 有助于使用正确的语言语法的代码辅助功能



代码模板:由代码辅助功能使用的代码模板是标准 C/C++ 语言语法结构的定义。您也可以定义自己的代码模板来扩展您自己的快捷键,如用于
author
date
关键字的快捷键。在 Window
=> Preferences => C/C++ => Code Templates
中,可以添加新模板并查看完整的模板列表。 也可以将模板作为 XML 文件导出和导入。

图 5. 预定义的 C/C++ 代码模板



代码历史记录:即使您没有使用 CVS 或其它源代码版本管理软件,也可以跟踪项目源代码中的本地更改。 在选择的文件上单击鼠标右键,从上下文菜单选择 Compare With => Local History...

图 6. 用 Local History 功能检查源代码中的更改



--------------------------------------------------------------------------------------------------------------------------------------------------------------

构建并运行项目

CDT 提供了一种设置项目构建选项的简单方法。CDT 依赖于三个 GNU 工具:GCC、GDB 和 Make。因此,对用于调试的 GDB 或用于编译的 GCC 和 Make 的依赖要求这些应用程序可用于用户想要使用的平台。 大多数 Linux(通常和类 POSIX)源代码软件包使用 autoconf 脚本来检查构建环境, 所以您必需运行
configure
命令,该命令在编译之前创建“Makefile”。CDT
没有提供编辑 autoconf 脚本的方法,所以必需手工编写它们;然而,您可以配置构建选项以在编译之前调用
configure
命令。

如果通过调用
make
命令来构建项目, 那么缺省设置没问题,但是,如果使用一种更复杂的方法进行构建,则必需在 Build Command 文本框中 输入适当的命令(例如,
make -f make_it_all
)。接下来,在
C/C++ Projects 视图中,选择 C/C++ project,然后单击鼠标右键并选择 Rebuild Project。所有来自 make、编译器和链接程序的编译消息都被重定向到控制台窗口:

图 7. 带编译器输出的控制台窗口



编译成功之后, 您或许想要运行您的应用程序。所有用于运行和调试的选项都位于主 Eclipse 菜单的 Run 菜单下。 然而,必须在早期定义用于运行项目的选项。可以通过转至主菜单(在那里,有用于运行应用程序的不同概要文件)中的 Run... 选项来完成这一步;例如,可以将一个概要文件用于测试目的,而将另一个概要文件用于运行最终版本。 另外,可以定义希望要传递给应用程序的参数,或者可以设置环境变量。 其它选项用于设置调试选项,例如使用哪个调试器(GNU GDB 或 Cygwin
GDB)。 图 8 显示了正在为项目创建运行概要文件(run profile)。

图 8. 为项目创建运行概要文件



当进入 C/C++ Projects 视图,选择您的项目,单击鼠标右键并在 Build Settings 选项卡上选择 Properties 之后,就可以使用更多的用于构建项目的常用选项。这些选项主要影响因遇到编译错误而使构建停止时所发生的情况。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

调试 C/C++ 项目

CDT 扩展了标准的 Eclipse Debug 视图, 使之具备了调试 C/C++ 代码的功能。Debug 视图允许您在工作台中管理程序的调试或运行。要开始调试当前项目,只要切换到 Debug 视图, 您将能够在代码中设置(并在执行过程中随时更改)断点/监测点并跟踪变量和寄存器。Debug 视图显示正在调试的每个目标的暂挂线程的堆栈框架。 程序中的每个线程都作为树中的一个节点出现,Debug 视图显示正在运行的每个目标的进程。

Eclipse 通过 CDT 调试 MI(CDT Debug MI)插件(其组件之一)支持与机器接口(Machine Interface,MI)兼容的调试器。 但 MI 调试器究竟是什么呢?通常情况下,象 ddd 和 xxgdb(请参阅 参考资料以获得链接)之类的第三方
GUI 调试器在实现调试功能时都依赖于 GDB 的命令行接口(Command Line Interface,CLI)。 遗憾的是,经过证实该接口非常不可靠。GDB/MI 提供了一种新的面向机器的接口, 它非常适合于想要直接解析 GDB 输出的程序。
--------------------------------------------------------------------------------------------------------------------------------------------------------------

结束语

C/C++ 开发工具箱(CDT)提供了一组功能强大的插件,这些插件可以帮助您用 Eclipse 开发 C/C++ 应用程序。虽然 CDT 仍处于开发阶段, 但您可以利用其现有的诸多功能。

参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文.

请加入 Eclipse 平台社区,并从 eclipse.org下载该平台。Eclipse 平台源代码是根据 Common Public License 特许的。在 eclipse.org 上,您还将找到有关 Eclipse 项目的术语词汇表和描述,以及技术文章和新闻组。Eclipse 平台白皮书详细描述了
Eclipse 的主要组件和功能。

从 eclipse.org 下载 CDT 项目的组件。

请访问 eclipse.org 上的 新闻组, 以获取与 C/C++ 插件相关的技术讨论和问题。

开发人员可以通过为该项目中每个组件所创建的 开发人员邮件列表(developer mailing lists)来参与和 C/C++ IDE 实现相关的讨论。

CDT 项目使用 bugzilla 作为其错误和功能跟踪系统。 在 Eclipse bugzilla 页上输入错误/功能报告与填写 Web 表单一样简单。

有关 Eclipse 平台及其工作原理的入门文章,请参阅由 Greg Adams 和 Marc Erickson 合著的 developerWorks文章“Working the
Eclipse Platform”。

要开始使用 Eclipse 平台开发应用程序,请参阅由 David Gallardo 撰写的 developerWorks文章“ Getting started with the
Eclipse Platform”。

如果您有兴趣创建自己的 Eclipse 插件,请参阅由 David Gallardo 撰写的 developerWorks文章“ 开发 Eclipse 插件”。

从 Red Hat 下载 Cygwin 工具箱

从 MinGW.org 下载 MinGW 工具箱

在 gnu.org 上学习有关 GNU make 语法的更多知识。

从 gnu.org 下载 dddGUI 调试器。

下载 xxgdbGUI 调试器。

请访问 WebSphere Studio Plug-in Central,以获取已被验证为“Ready
for WebSphere Studio Software”的插件的目录。

学习 IBM WebSphere Studio 工具的一个扩展, 它提供了有助于您使用这些工具的信息和工具。 由于所有 WebSphere Studio 工具都基于 WebSphere Studio 工作台(WebSphere Studio Workbench),而工作台基于 Eclipse 框架, 所以很容易通过使用 Eclipse 帮助扩展功能来扩展产品文档。 请参阅文章“ Adding
Self-Help Support to WebSphere Studio Tools by Extending their Eclipse Help Systems”。

请在 developerWorks上查找更多的 Eclipse 用户参考资料。

================================================================================================================

其他Eclipse技巧:

代码自动对齐: ctrl+shift+f

行注释/销注释: Ctrl+/

块注释/销注释: Ctrl+Shift+/ Ctrl+Shift+\

查找 查找替换: Ctrl+H Ctrl+F

查找下一个/往回找: Ctrl+K Ctrl+Shift+K

跳到某行: Ctrl+L

查找当前元素的声明: Ctrl+G

查找当前元素的所有引用: Ctrl+Shift+G

快速修正: Ctrl+1

引入某个类(接口):ctrl + shift + m

加头注释: shift + alt + j

ctrl + shift + g:查看引用

ctrl + shift + n:重命名

ctrl + shift + o:导入类

ctrl + shift + r:启动上次运行

ctrl + shift + f:格式化代码

ctrl + c:复制

ctrl + v:粘贴

ctrl + x:切剪

ctrl + a:全选

ctrl + f:查找

ctrl + z:撤销

ctrl + y:重做

ctrl + s:保存

---------------------------------------------------------------

用的最多的应该就是CTRL+SHIFT+S

还有格式化用的也挺多。

---------------------------------------------------------------

ctrl + shift + f 格式化代码

ctrl + shift + o 组织导入

F3 打开声明

Alt + shift + r 重命名变量

---------------------------------------------------------------

up

---------------------------------------------------------------

Alt+/

---------------------------------------------------------------

alt + left

alt + right

ctrl + q

---------------------------------------------------------------

ctrl + shift + g:查看引用

ctrl + shift + n:重命名

ctrl + shift + f:格式化代码

ctrl + c:复制

ctrl + v:粘贴

ctrl + a:全选

ctrl + f:查找

ctrl + z:撤销

ctrl + s:保存

Alt + / 智能提示

---------------------------------------------------------------

ctrl + shift + g:查看引用

ctrl + shift + n:重命名

ctrl + shift + o:导入类

ctrl + shift + r:启动上次运行

ctrl + shift + f:格式化代码

ctrl + c:复制

ctrl + v:粘贴

ctrl + x:切剪

ctrl + a:全选

ctrl + f:查找

ctrl + z:撤销

ctrl + y:重做

ctrl + s:保存

Alt + / 智能提示

F3 打开声明

Alt + shift + r 重命名变量

其实最常用的就是下面几个:

ctrl + shift + o:导入类

ctrl + shift + f:格式化代码

ctrl + c:复制

ctrl + v:粘贴

ctrl + x:切剪

ctrl + z:撤销

ctrl + s:保存

Alt + / 智能提示

---------------------------------------------------------------

Ctrl+M: 工作区最大化/最小化

Alt+/: 智能提示

F3: 察看声明

Crtl+1: 修正错误

Shift+Alt+T: 重构

Shift+Alt+M: 提取函数

Shift+Alt+R: 重命名

Shift+Alt+C: 更改函数标记

Ctrl+Shitf+F: 格式化代码

---------------------------------------------------------------

ctrl + shift + o:导入类

atl + /:提示

ctrl + shift + t:查找相关信息

---------------------------------------------------------------

Eclipse快捷键指南

编辑

作用域 功能 快捷键

全局 查找并替换 Ctrl+F

文本编辑器 查找上一个 Ctrl+Shift+K

文本编辑器 查找下一个 Ctrl+K

全局 撤销 Ctrl+Z

全局 复制 Ctrl+C

全局 恢复上一个选择 Alt+Shift+↓

全局 剪切 Ctrl+X

全局 快速修正 Ctrl1+1

全局 内容辅助 Alt+/

全局 全部选中 Ctrl+A

全局 删除 Delete

全局 上下文信息 Alt+?

Alt+Shift+?

Ctrl+Shift+Space

Java编辑器 显示工具提示描述 F2

Java编辑器 选择封装元素 Alt+Shift+↑

Java编辑器 选择上一个元素 Alt+Shift+←

Java编辑器 选择下一个元素 Alt+Shift+→

文本编辑器 增量查找 Ctrl+J

文本编辑器 增量逆向查找 Ctrl+Shift+J

全局 粘贴 Ctrl+V

全局 重做 Ctrl+Y

查看

作用域 功能 快捷键

全局 放大 Ctrl+=

全局 缩小 Ctrl+-

窗口

作用域 功能 快捷键

全局 激活编辑器 F12

全局 切换编辑器 Ctrl+Shift+W

全局 上一个编辑器 Ctrl+Shift+F6

全局 上一个视图 Ctrl+Shift+F7

全局 上一个透视图 Ctrl+Shift+F8

全局 下一个编辑器 Ctrl+F6

全局 下一个视图 Ctrl+F7

全局 下一个透视图 Ctrl+F8

文本编辑器 显示标尺上下文菜单 Ctrl+W

全局 显示视图菜单 Ctrl+F10

全局 显示系统菜单 Alt+-

导航

作用域 功能 快捷键

Java编辑器 打开结构 Ctrl+F3

全局 打开类型 Ctrl+Shift+T

全局 打开类型层次结构 F4

全局 打开声明 F3

全局 打开外部javadoc Shift+F2

全局 打开资源 Ctrl+Shift+R

全局 后退历史记录 Alt+←

全局 前进历史记录 Alt+→

全局 上一个 Ctrl+,

全局 下一个 Ctrl+.

Java编辑器 显示大纲 Ctrl+O

全局 在层次结构中打开类型 Ctrl+Shift+H

全局 转至匹配的括号 Ctrl+Shift+P

全局 转至上一个编辑位置 Ctrl+Q

Java编辑器 转至上一个成员 Ctrl+Shift+↑

Java编辑器 转至下一个成员 Ctrl+Shift+↓

文本编辑器 转至行 Ctrl+L

搜索

作用域 功能 快捷键

全局 出现在文件中 Ctrl+Shift+U

全局 打开搜索对话框 Ctrl+H

全局 工作区中的声明 Ctrl+G

全局 工作区中的引用 Ctrl+Shift+G

文本编辑

作用域 功能 快捷键

文本编辑器 改写切换 Insert

文本编辑器 上滚行 Ctrl+↑

文本编辑器 下滚行 Ctrl+↓

文件

作用域 功能 快捷键

全局 保存 Ctrl+X

Ctrl+S

全局 打印 Ctrl+P

全局 关闭 Ctrl+F4

全局 全部保存 Ctrl+Shift+S

全局 全部关闭 Ctrl+Shift+F4

全局 属性 Alt+Enter

全局 新建 Ctrl+N

项目

作用域 功能 快捷键

全局 全部构建 Ctrl+B

源代码

作用域 功能 快捷键

Java编辑器 格式化 Ctrl+Shift+F

Java编辑器 取消注释 Ctrl+

Java编辑器 注释 Ctrl+/

Java编辑器 添加导入 Ctrl+Shift+M

Java编辑器 组织导入 Ctrl+Shift+O

Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。

也可以使用Ctrl+1自动修正。

运行

作用域 功能 快捷键

全局 单步返回 F7

全局 单步跳过 F6

全局 单步跳入 F5

全局 单步跳入选择 Ctrl+F5

全局 调试上次启动 F11

全局 继续 F8

全局 使用过滤器单步执行 Shift+F5

全局 添加/去除断点 Ctrl+Shift+B

全局 显示 Ctrl+D

全局 运行上次启动 Ctrl+F11

全局 运行至行 Ctrl+R

全局 执行 Ctrl+U

重构

作用域 功能 快捷键

全局 撤销重构 Alt+Shift+Z

全局 抽取方法 Alt+Shift+M

全局 抽取局部变量 Alt+Shift+L

全局 内联 Alt+Shift+I

全局 移动 Alt+Shift+V

全局 重命名 Alt+Shift+R

全局 重做 Alt+Shift+Y

================================================================================================================

转自 http://mogoweb.net/archives/335


打造称手的开发工具-Eclipse篇

古人云,工欲善其事,必先利其器,孙悟空为了找到称手的兵器,苦苦寻觅,终于寻得定海神针一枚,打造出如意金箍棒,但有多少程序员能够静心专研手头的工具呢?从事软件开发多年,接触了各种各样的软件开发工具,远的不说,代码编辑工具就接触过不少,Turbo C/Visual Studio/C++ Builder/Source Insight/UltraEdit/Vim等,但都没有精通,更别说按照自己的喜好增加一些脚本/插件。转入Android开发后,又开始接触Eclipse,发现Eclipse真是个好东西。但要让自己运用的得心应手,还需要专研一些设置。本文就是记录一下我在开发过程中的一些Eclipse设置。


1. 过滤某些文件/文件夹

阅读android源码(C++)及chromium源码时,选择新建工程的选项: Makefile Project with Existing Code。众所周知,android和chromium的源码超级大,Eclipse打开这些大工程,在Refresh Workspace和Indexer时非常慢,而且极占CPU。通常情况下,我们可能只对其中的部分文件感兴趣,有必要进行一下过滤。Eclipse提供了Include Filter和Exclude Filter,顾名思义,Include Filter就是只包含满足条件的文件/文件夹,Exclude
Filter则是排除满足条件的文件/文件夹。可以定义多个Filter。方法如下:

Project Explorer中,选定某个目录,点击右键,选择Properties,找到Resource Filters,点击Add…:



可以选择按Name/Project Relative Path/Location/Last Modified/File Length等等进行匹配,我一般使用Project Relative Path进行匹配。


2. 导入google c++编程风格

chromium C++代码采用的是google c++ code style。google c++编码规范被李开复称为最好的C++编程规范,有趣的可以到这里看看,条目非常多。

Eclipse也非常强大,可以支持不同的code style,而且这些style可以自定义,还可以导入/导出(需要注意的是,Eclipse的code style主要针对代码缩进/空格/括号位置,并不涉及变量命名等等)。google也提供了针对Eclipse的xml配置文件,我们只需导入到Eclipse即可,省去繁琐的配置。下面就说说导入方法。

http://google-styleguide.googlecode.com/svn/trunk/下载eclipse-cpp-google-style.xml
打开Eclipse,选择Window | Preferences 菜单。
在弹出对话框左边中选择C/C++ | Code Style。然后点击后侧的Import…按钮
选择所下载的eclipse-cpp-google-style.xml文件,可以看到Select a profile下面的下拉框中多了Google C++选项。
点击Apply按钮


3. 常用快捷键

CTRL+TAB头文件和c/c++文件之间切换
CTRL+SHIFT+R对话框中输入文件名(有联想功能),快速打开文件
CTRL+SHIFT+R对话框中输入文件名(有联想功能),快速打开文件
CTRL+o输入方法(函数)名,可快速定位到方法(函数)
CTRL+l输入行号,快速定位到指定行
CTRL+h打开文件搜索对话框
================================================================================================================================


eclipse+cdt+gcc编译选项控制

转自 http://hi.baidu.com/sfzhaoif/item/32ecf6bfe055b542bb0e1209

如果我们的程序调用动态链接库,当在cdt中运行的时候,可以通过run-->enviroment-->添加LD_LIBRARY_PATH 环境变量来设置查找动态链接库文件的路径。但是在运行的时候,程序去那里找动态链接库呢?

方法主要有两种。一种,是设置系统的LD_LIBRARY_PATH 环境变量(在eclipse里设置对外部正式运行的程序无效)。设置的方法见附录资料三

另外一种,是将动态链接库文件的路径编译进二进制可执行文件。那么在eclipse如何进行编译呢?如下图



好了,这下我们的程序就可以脱离eclipse运行了(,找了好久啊)。注意,不要设置错误了,是g++linker的miscellaneous。

第二种方法的缺点是,库的地址就不能变动了(在游戏等应用程序中用这种方法教好)。第一种方法的优点是通过更改LD_LIBRARY_PATH的值,可以变动库文件的地址。它的缺点当然就是还要改动环境变量的值了。

---------------------------------------------------------可爱的分割线----------------------------------------------------------

(一)linux 动态库http://linux.chinaunix.net/bbs/archiver/?tid-974839.html

1. Linux下动态库使用小结

. 静态库和动态库的基本概念

静 态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文 件支持,如果机器里没有这些库文件就不能运行。

2. 如何使用动态库

如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照 /etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过 设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用LD_LIBRARY_PATH》)。

不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运 行,所以多用在调试。(LD_LIBRARY_PATH的缺陷和使用准则,可以参考《Why

LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

3.库的链接时路径和运行时路径

现代连 接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/-llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-
rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

(二)如何使Linux启动之后就加载LD_LIBRARY_PATH的路径http://topic.csdn.net/t/20041020/10/3472713.html

请问如何使Linux启动之后就加载LD_LIBRARY_PATH的路径!

是修改.bash_profile文件吗,我修改了但是启动Linux之后LD_LIBRARY_PATH的路径还是没有,运行程序时有些库文件加载不上!

1 楼winux0(随缘不变)

记住最后要export LD_LIBRARY_PATHTop

楼bekars(涡轮增压:没有解决不了的问题,因为根本就没有问题)

.bash_profile

[plain] view
plaincopy

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

[plain] view
plaincopy

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

[plain] view
plaincopy

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export PATH

export LD_LIBRARY_PATH

unset USERNAME

[plain] view
plaincopy

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export PATH

export LD_LIBRARY_PATH

unset USERNAME

还是不行Top

3 楼cheeralen(嵌入式)

bash不会从profile文件里读取环境变量的

csh才会从profile文件里读取变量

所以你可以修改你的bash为csh!!!Top

4 楼bekars(涡轮增压:没有解决不了的问题,因为根本就没有问题)

楼上的不太明白,能不能说多一些Top

5 楼winux0(随缘不变)

应该不会吧,不然你的export的那些PATH也没有用哦Top

6 楼bekars(涡轮增压:没有解决不了的问题,因为根本就没有问题)回复于 2004-10-20 12:35:29 得分 0

不知道,你可以帮我试试吗?我这里就是不行

[plain] view
plaincopy

.bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export PATH

export LD_LIBRARY_PATH

unset USERNAME

[plain] view
plaincopy

.bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export PATH

export LD_LIBRARY_PATH

unset USERNAME

(三)使用LD_LIBRARY_PATH( http://blog.chinaunix.net/u1/48140/showart_377250.html)

环境变量LD_LIBRARY_PATH用来指定查找共享库时除了默认路径之外的其他路径。(该路径在默认路径之前查找)

移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时我们可以设置LD_LIBRARY_PATH。

例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/

这样就可以使用/work/lib/下的库文件了,运行程序后系统会自动到环境变量LD_LIBRARY_PATH指定的路径中查找其所需的库。

系统查找动态库的顺序

系统先找LD_LIBRARY_PATH下的库再找/lib and /usr/lib等路径下的库,还有/etc/ld.so.conf里指定的路径(如果ld.so.conf存在),man ldconfig for more information

使Linux启动之后就加载LD_LIBRARY_PATH的路径

/etc/rc.d/rc.local文件中加入export LD_LIBRARY_PATH="xxxxx" 即可.

如果在链接时使用了"-R"和"-L"选项,则相关动态库的路径将保存在ELF文件中,于是以后的运行中不再需要设置环境变量去定位动态库。比如,有一个 /usr/local/lib/libfoo.so,而你的bar程序需要这个libfoo.so,编译、链接时最好 这样 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo

(#man gcc ,没发现-R或-rpath选项,待查)

===============================================================================================================

转自 http://hi.baidu.com/open_hard/item/8dd295db64d6c0ea54347f1b

Linux动态库(.so)搜索路径

众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。

可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。

例1:

我们通过以下命令用源程序pos_conf.c(见程序1)来创建动态库 libpos.so,详细创建过程请参考文[1]。

# gcc -c pos_conf.c

# gcc -shared -fPCI -o libpos.so pos_conf.o

#

#include <stdio.h>

void pos()

{

printf("/root/test/conf/lib\n");

}

程序1: pos_conf.c

接着通过以下命令编译main.c(见程序2)生成目标程序pos。

# gcc -o pos main.c -L. -lpos

#

void pos();

int main()

{

pos();

return 0;

}

程序2: main.c

然后把库文件移动到目录/root/test/conf/lib中。

# mkdir -p /root/test/conf/lib

# mv libpos.so /root/test/conf/lib

#

最后编辑配置文件/etc/ld.so.conf,在该文件中追加一行"/root/test/conf/lib"。

运行程序pos试试。

# ./pos

./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory

#

出错了,系统未找到动态库libpos.so。找找原因,原来在编辑完配置文件/etc/ld.so.conf后,没有运行命令ldconfig,所以刚才的修改还未生效。我们运行ldconfig后再试试。

# ldconfig

# ./pos

/root/test/conf/lib

#

程序pos运行成功,并且打印出正确结果。

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。

通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。下面通过例2来说明本方法。

例2:

我们通过以下命令用源程序pos_env.c(见程序3)来创建动态库libpos.so。

# gcc -c pos_env.c

# gcc -shared -fPCI -o libpos.so pos_env.o

#

#include <stdio.h>

void pos()

{

printf("/root/test/env/lib\n");

}

程序3: pos_env.c

测试用的可执行文件pos可以使用例1中的得到的目标程序pos,不需要再次编译。因为pos_conf.c中的函数pos和pos_env.c中的函数pos 函数原型一致,且动态库名相同,这就好比修改动态库pos后重新创建该库一样。这也是使用动态库的优点之一。

然后把动态库libpos.so移动到目录/root/test/conf/lib中。

# mkdir -p /root/test/env/lib

# mv libpos.so /root/test/env/lib

#

我们可以使用export来设置该环境变量,在设置该环境变量后所有的命令中,该环境变量都有效。

例如:

# export LD_LIBRARY_PATH=/root/test/env/lib

#

但本文为了举例方便,使用另一种设置环境变量的方法,既在命令前加环境变量设置,该环境变量只对该命令有效,当该命令执行完成后,该环境变量就无效了。如下述命令:

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/root/test/env/lib

#

程序pos运行成功,并且打印的结果是"/root/test/env/lib",正是程序pos_env.c中的函数pos的运行结果。因此程序pos搜索到的动态库是/root/test/env/lib/libpos.so。

方法三:在编译目标代码时指定该程序的动态库搜索路径。

还可以在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

例3:

我们通过以下命令用源程序pos.c(见程序4)来创建动态库libpos.so。

# gcc -c pos.c

# gcc -shared -fPCI -o libpos.so pos.o

#

#include <stdio.h>

void pos()

{

printf("./\n");

}

程序4: pos.c

因为我们需要在编译目标代码时指定可执行文件的动态库搜索路径,所以需要用gcc命令重新编译源程序main.c(见程序2)来生成可执行文件pos。

# gcc -o pos main.c -L. -lpos -Wl,-rpath,./

#

再运行程序pos试试。

# ./pos

./

#

程序pos运行成功,输出的结果正是pos.c中的函数pos的运行结果。因此程序pos搜索到的动态库是./libpos.so。

以上介绍了三种指定动态库搜索路径的方法,加上默认的动态库搜索路径/lib和/usr/lib,共五种动态库的搜索路径,那么它们搜索的先后顺序是什么呢?

在介绍上述三种方法时,分别创建了动态库./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我们再用源程序 pos_lib.c(见程序5)来创建动态库/lib/libpos.so,用源程序pos_usrlib.c(见程序6)来创建动态库 /usr/lib/libpos.so。

#include <stdio.h>

void pos()

{

printf("/lib\n");

}

程序5: pos_lib.c

#include <stdio.h>

void pos()

{

printf("/usr/lib\n");

}

程序6: pos_usrlib.c

这样我们得到五个动态库libpos.so,这些动态库的名字相同,且都包含相同函数原型 的公用函数pos。但存储的位置不同和公用函数pos 打印的结果不同。每个动态库中的公用函数pos都输出该动态库所存放的位置。这样我们可以通过执行例3中的可执行文件pos得到的结果不同获知其搜索到了 哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,如此往复, 将可得到Linux搜索动态库的先后顺序。程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示:

创建各个动态库,并放置在相应的目录中。测试环境就准备好了。执行程序pos,并在该命令行中设置环境变量LD_LIBRARY_PATH。

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

./

#

根据程序pos的输出结果可知,最先搜索的是编译目标代码时指定的动态库搜索路径。然后我们把动态库./libpos.so删除了,再运行上述命令试试。

# rm libpos.so

rm: remove regular file `libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/root/test/env/lib

#

根据程序pos的输出结果可知,第2个动态库搜索的路径是环境变量LD_LIBRARY_PATH指定的。我们再把/root/test/env/lib/libpos.so删除,运行上述命令。

# rm /root/test/env/lib/libpos.so

rm: remove regular file `/root/test/env/lib/libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/root/test/conf/lib

#

第3个动态库的搜索路径是配置文件/etc/ld.so.conf指定的路径。删除动态库/root/test/conf/lib/libpos.so后再运行上述命令。

# rm /root/test/conf/lib/libpos.so

rm: remove regular file `/root/test/conf/lib/libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/lib

#

第4个动态库的搜索路径是默认搜索路径/lib。我们再删除动态库/lib/libpos.so,运行上述命令。

# rm /lib/libpos.so

rm: remove regular file `/lib/libpos.so'? y

# LD_LIBRARY_PATH=/root/test/env/lib ./pos

/usr/lib

#

最后的动态库搜索路径是默认搜索路径/usr/lib。

综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

在上述1、2、3指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。对此本文不再举例说明,有兴趣的读者可以参照本文的方法验证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: