构建跨平台的自由桌面开发环境(C/C++)(二)软件安装和配置

来源:互联网 发布:孙行者网络 编辑:程序博客网 时间:2024/05/21 07:50
(二)软件安装和配置

在IBM的DevelopWorks网站上已经有一篇文章(1)讲述了如何在Eclipse平台上使用CDT开发C/C++应用,重点是介绍CDT,可以和本段相互参考。

与一般软件安装的情形不同,这里首先我会安排大家安装编译环境,然后才是IDE。这也跟霸道的微软作风有所不同,可能有人认为他那套方便,但作为开发人员我觉得知道这个次序是十分重要的。

1、Cygwin

因为这是入门教程,所以不会教大家如何自行编译安装GCC(我自己也不会),所有一切都由Cygwin替我们打点好,上篇中已经告诉大家如何获取它。如果你自己有心读取很少的一些文档,然后稍作尝试,相信可以跳过这段了。

Cygwin的安装是很方便的,只要跟随得到的setup运行提示,然后选择安装相应的程序包就可以了(安装也可以透过网络进行,只需要下载setup及相关很少的程序,不过由于国内糟糕的线路,还是建议下载(所有或必需的)安装包到本地)。当然对于没有 接触过linux的人而言,选择本身也是比较痛苦的事情。但我这样的笨人一般遇到这种情况总是不管三七二十一,全部(或者缺省)安装拉倒(如果你感到痛苦了,那么恭喜你,应该算是比我聪明了,如果你感到特别的痛苦,那么不要告诉我,你聪明到连提示也不看了 )。

和一般Windows下面的“垃圾”应用不同,Cygwin除了可能多占一些硬盘外,不会给你的系统带来额外的负担:不会往已经不堪重负的注册表中添加乱七八糟的东西,也不会往其他目录里塞入某名奇妙的文件,所有的东西都在你指定的目录下安静的躺着,直到 魔鬼或你发出指令。当然不要忘记的是已经在环境变量中附加了(这些指令包括动态链接库的)执行路径。

Cygwin的核心是以动态链接库的形式存在的,所有Cygwin的命令都可以在Windows环境下直接运行。同时安装完成后,会帮助你建立一个到仿真Linux的Shell命令环境Bash(类似于Windows里面的command/cmd)的快捷方式,在这个下面感觉和linux命令行终端没有任何区别,可以方便的做一些熟悉的Unix/Linux下面的工作,或者用于学习。

[基础知识]Cygwin(Unix风格)的目录路径

有一篇文章(2)专门讲述Unix下系统目录的安排,这对于操作系统(特别是多用户)而言是一个很重要的问题。Windows系统在很晚才将这个问题确定下来,可看起来除了更加繁琐外,并没有什么进步。Windows继承了许多Dos遗产,比如盘符,比如 反斜杠分割的目录路径。对于初始转向Unix/Linux的人而言,可能感觉Windows的方式更加直观。就算不是习惯作崇的因素,深入考虑一下就会知道Unix的方式(其实也是专业计算机领域的方式)才是更加简洁一致的方式。比如盘符标识,考虑到存储设备的历史和将来,就不尽合理。而且Dos/Windows下硬盘也是要分区的,在多个硬盘下还有分区的次序问题,最终就是导致一个混乱的计算方式。尽管在个人计算机上(阶数有限)情况下,这种混乱增加不了多少复杂性,但对于一些大型系统而言恐怕就不能接受了。Unix的方式虽然包含对认知上的一个 需求,但一旦理解以后,一致性就开始发挥更加有效的作用,这也是所以成为知识的要素。

后期Windows不得已引入了这些概念(因为我想这些概念对于美国的开发人员应该是常识的),可以把某个分区加载(Mount)到指定的目录之下,除了感觉有些怪异外也算是不小的进步。但至今两个系统在正反斜杠的使用上仍然没有达到一致。这经常令我感到 困惑,比如在使用Java这样的跨平台应用时。在这里我们也将不可避免的涉及到这个问题。

因为cygwin内部使用linux风格的路径,它将自己安装的目录作为根目录,而把各硬盘映射(mount)到/cygdrive/[小写盘符]路径下(可以通过df命令查看),如果需要自己另行加载某个目录到指定cygwin目录中,只需要运行mount [windows路径名] [cygwin路径名] 即可,如果不希望继续加载就运行umount [cygwin 路径名],也可以用不带参数mount命令查看当前的加载情况。当然和linux一样,加载点(加载到的cygwin路径名),是必须在cygwin目录结构中存在的目录。

讲目录路径的一个重要意义在于,因为我们编写正式项目的代码一般是按目录结构进行组织的,相应会有一个makefile,如果在不同平台上目录的表现形式不一致的话,必然导致错误的发生和维护工作量的加大。

对于一般的聪明人而言,我这里对安装包做一个大概而且极有可能不准确的解释,不过没关系,作为聪明人第一点就是要知道笨人的经验也是有用的。

熟悉Linux的人会知道,linux上的应用是以包形式存在的,相关的程序或者文档打入在一个包中,这样包不下几百个,安装程序对这些包作了进一步分类(Cygwin中称为Category),比如基本系统,管理工具,开发工具,文档处理,打印,图形, 多媒体,X桌面等等。Cygwin也是如此,结合安装界面相信就会很容易明白了。Cygwin同时根据安装的要求和情况对每个包作为一个描述,包括:当前安装的包(的版本)(Current),将要安装的新的包(的版本)(New),是否安装二进制文件( Bin)(即可执行程序或程序库等),是否安装源代码(Src),当然不能缺少对包的描述(Package)。

为什么会强调版本号,这个你一看就会明白,因为Cygwin对每个包提供了不止一个版本,你可以选择适合的,缺省一般是最新版本的。这个我想不要我教你如何选择吧,如果你知道你就会知道(当然也还有例外)。至于如何选择?啊,你不会看不懂那些图标吧?就算 看不懂也没关系,傻瓜都知道怎么做的---乱点一气。注意选择可以在类和包两个层次上做的,前者是粗调,后者是微调。你可以反复安装,更新Cygwin,或者从cygwin的镜像网站更新包到你本地的版本,然后再安装更新。

好了,说了很多的废话,你可以随便胡来,我不行,不能忘记这里的目的。所以还是要提醒大家,我们需要安装编译器,连接器,必要的程序库,这些个东西主要在Devel分类中(注意的是不同分类中包会有重叠,但只需在一处选择即可),这样你就很容易直奔主题( 贬义词?)。基本上以下的包是必不可少的:(描述即Cygwin中的)

binutils: The Gnu assembler, linker and binary utilities

gcc-core: C compiler

gcc-c++: C++ compiler

需要注意的,目前cygwin标注的gcc相关编译包缺省版本是3.3.3,而最新其实是3.4.1,也许是3.3.3比较稳定,但我实际使用中发现3.4.1的兼容性更好,所以大家最好自己手工改选安装版本3.4.1。这也就是上面说的例外。

gdb: The Gnu Debugger

make: The Gnu version of the 'make' utility

一般从事开发,或者需要在Cygwin下面编译安装一些开源应用什么的,这些也是必要的:automake及相关包,autoconf及相关包,libtool及相关包。这三者统称autotool,如果需要做好跨平台的项目,他们是必不可少的。有一本a utobook(1)专门讲述如何使用他们,并且有中文版本。他们主要目的和Makefile相关,简单来说就是帮你自动完成(编写跨平台的或者更准确是跨平台编写)Makefile。这个方面还有一个工具CMake(3),在Cygwin里面也有编译好 的本地版本。

当然做真正的开发,我们不止需要这些,还需要很多程序库(我非常提倡大家使用程序库共享程序库,而不是重新发明轮子,特别对于“牛人”辈出的C/C++开发者们而言,要多学习Java/c#,乃至Perl等动态语言的成功经验)。开源社区为我们提供了很多工业强度的库,你基本上都可以在Cygwin中找到(已经编译好的版本)。

[提示] 再论MinGW

在cygwin也附带有mingw,实际上你可以使用mingw的编译器,以获取更加纯粹的win32本地应用(脱离cygwin动态dll库的)。但我并不建议这么做,这样会带来不少麻烦。cygwin和mingw并不兼容,也就是说你不能期许用min gw代替cygwin编译器编译跨平台应用,即使你用cygwin所附带的库及头文件也是如此,因为mingw也包含有自己的基本c库头文件,和cygwin带的与linux syscall结合紧密地c库大不一样,而他的c++编译器强烈依赖其c库头文件,反之cygwin亦如此。这样大多数情况下,你就不能在纯粹的本地应用和跨平台编译之间透明切换,而只能是两者择一。

[提示] Cygwin中的程序库

Cygwin中附带了很多开源的程序库,这样你就可以不必自己辛辛苦苦下载来编译了,尽管版本不一定是最新。不要小看这一点,要知道有些库是很大的,编译起来也是很耗费时间的(比如libxml2),说不定还有些兼容性问题,就算是有源代码没有一定耐心也 是很难搞定的。

一些比较有趣的有C单元测试库check,C++单元测试库cppunit,还有源代码格式化工具astyle。虽然个人认为他们并不完全是那么好用甚至有些麻烦(至少不是必用不可)。还有比如Gtk+及相关库的cygwin版本,注意不是win32版本 ,这在后面将会继续讲到。

好的,到现在一切顺利,还有一件事情提醒大家不要忘记:设置环境变量。虽然在一般情况下我们无需设置环境变量就能工作,但记住我们必须要让计算机按其自己的工作方式工作,这才可能少遇麻烦。

首先是cygwin下面命令路径的执行路径,这个我记不太清楚是安装cygwin自动添加上的,还是手动添加的。你们可以安装完后检查一下在环境变量path中是否包含有cygwin安装目录下bin目录,cygwin目录结构比unix/linux简化,所有的运行命令及动态链接库都在这个目录下。

还有就是gcc/g++编译器的环境变量,我们知道c/c++编译离不开大量的头文件和函数库,而在编译时一一指定这些文件和库的路径是非常麻烦的,即便是有makefile的情况下。多数情况我们还是希望多一些好的习惯,减少一些不必的繁琐。你可以通过man gcc或者man g++命令查看帮助手册,在最后面有关于环境变量的说明,这里我就不一一啰嗦了。虽然很多文章会提到有一些必需的设置,这里我也告诉大家,基本上你不用设置也是可以工作的,因为cygwin(包括mingw)把编译器编译时需要用的基本的头文件路径已经编 译到编译器里面了。而eclipse也可以通过编译器自动发现这些基本路径的。一般我会给C_INCLUDE_PATH或者CPLUS_INCLUDE_PATH附加上指向/usr/local/include目录,而为LIBRARY_PATH附加上指向/usr/local/lib目录,这是因为按照unix/linux的习惯,自己编译的第三方库会放在/usr/local目录下。

[注] 在最新版本的eclipse cdt中已经可以设置局部的环境变量,这样就不用污染全局环境变量空间了(注意:对于开发人员这是程序设计中变量处理的一个指导性原则)。当然还有一个好处就是改环境变量不需要重新启动(程序)。

安装好Cygwin后,我们就可以测试一下了,这里仅仅就编译器说事了:

在Windows命令行下或者Cygwin Bash提示符下运行命令gcc -v或者g++ -v看看输出的版本等信息,注意命令的大小写问题,虽然在Windows下是无所谓大小写的,但在类unix环境下都是区分的,所以要跨平台首先要注意大小写问题,比如头文件名的大小写,再也不能随便了(Windows下不会帮你检查这个)。

然后我们写个极简单的C++程序helloworld.cpp,同样要提醒自己注意大小写,尽管无关紧要:

#include <iostream>

int main()

{

std::cout << "Hello World!" << std::endl;

return 0;

}

 

虽然几句话,这其中有很多注意的要素,我不一一讲述,只是提醒大家以一种严谨的态度对待每一行代码,哪怕很简单的一件事。

然后编译:g++ -o helloworld.exe helloworld.cpp

运行helloworld.exe,看看是不是真的也能做些事情。

 



 

2、Eclipse

Eclipse平台运行需要JRE(或者JDK),可以从Sun网站(4)下载最新的版本。如果有人打算跟随本文做一下探险活动,应该准备好了这些个主要的大家伙。Eclipse的安装很有特点,仅仅需要解包下载来的压缩文件到自己指定的目录就可以工作( 怎么感觉跟这里所讲述的主题有所冲突?作为开发人员应该对此有所反应,即一个重要命题:软件为什么需要安装?我不打算讨论哲学问题,仅仅稍作提示,这和软件架构方式有着重要关系),所有Eclipse平台下的组件都是如此。因为本文开始所述的历史,缺省下 载的Eclipse(5),无论哪个版本都不包含有CDT,但聪明如你,选择下载最大的那个家伙也是有很大可能省些事情的。然后到这里(6)下载对应版本的CDT安装包同样解压到Eclipse目录中即可以开始进入下一步了,是不是很简单:-)。

[提示]选择何种Eclipse/CDT版本

Eclipse经历了1.x,2.x,3.0x乃至最新尚未稳定的3.1版本,一般对于小数点前面的大版本号而言,不同的版本会有很大的差别,而对于小数点后面,一般都是选择最新(大)的那个比较好(至少对于稳定版本而言),这个道理不言自明。同样的,如 果没有兼容的负担,大版本号亦是如此。使用Eclipse较早的Java开发人员可能还有不少在使用2.x的版本(JDT的版本号和Eclipse平台版本号保持一致),考虑某些因素,3.x版本对他们可能并没有太大的诱惑力。但CDT不同,直到随着3. 0x版本推出的2.x版本的CDT才算是开始成熟。而随着3.1版本推出的3.0版的CDT(也在测试之中)解决了不少易用性上的问题。虽然都是测试版本,但大多数应用情况下并不会带来麻烦,而且目前已经进入测试后期,所以建议大家安装最新的测试版,同时 注意保持更新。

安装完了,我们就可以运行eclipse,一般你不用对CDT设置什么参数就可以工作了,当然在最新的测试版本中引入了环境变量设置。如果有必要可以选取Windows->Perferences...菜单,在C/C++中设置你希望的参数。



设置完后,选择Windows->Open Perspective->C/C++菜单,打开C/C++透视图就可以进入c/c++的项目开发和管理了。



对于同时进行java等其他类型项目开发的话,为了保持同一类型项目的管理,可以在C/C++ projects视图中的下拉菜单中设定filter:



同时,因为c/c++和java不一样,编译的速度很慢,所以我们关闭在project菜单里的自动构建(Build Automatically)功能。

然后,我们就可以开始创建一个c/c++项目,

因为希望能尽快上手,这里我们采取“傻瓜”方式创建和管理项目,在c/c++ projects视图中点取右键选择New菜单中的Managed Make C++ Project,然后输入Project name,一路next,或者直接点取Finish,创建项目。



项目创建完成后,你会发现项目中有一个Includes子项,其中包含了必要的和你在环境变量中附加的头文件的路径:



然后在刚创建的项目上点取右键,选择New菜单中的(C)source file,输入Source file的名称



在新建的main.cpp中输入上面的程序,保存。



在项目右键菜单中选取Build,构建项目,会发现多出一个Binares子项,其中有以项目名命名的一个exe可执行文件,在其上点取右键,选择Run As菜单中的Run As C/C++ Local Application运行程序,并在Console视图中察看输出信息。



至此,我们已经初步搭建了一个基本的开发平台。

(1)待考

(2)待考

(3)www.cmake.org

(4)www.sun.com/java/

(5)www.eclipse.org/download.html

(6)www.eclipse.org/cdt