第一章 在视窗操作系统下的GCC
第一节 GCC家族概览
GCC是GNU公社的一个项目。是一个用于编程开发的自由编译器。最初,GCC只是一个C语言编译器,他是GNU C Compiler 的英文缩写。随着众多自由开发者的加入和GCC自身的发展,如今的GCC以经是一个包含众多语言的编译器了。其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。也就是 GNU编译器家族 的意思。当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。
如今,在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,Cygwin和Djgpp。虽然,Djgpp是应用于DOS系统的,考虑到windows对DOS的兼容,所以也将Djgpp纳入其中了。
第二节 入乡随俗的MinGW
MinGW是Minimalistic GNU for Windows 的缩写。她是一个建立在GCC和binutils 项目上的编译器系统。和其他GCC的移植版相比,她可以说是最接近Win32的一个了。因为,MinGW几乎支持所有的Win32API,这也是MinGW的特色之一。她所连接的程序,不需要任何第三方库就可以运行了。在某种程度上看,MinGW更像是VC的替代品。
MinGW可以从MinGW的官方网站 http://www.mingw.org 上获得。
首先,你要从 http://www.mingw.org/download.shtml 上下载如下几个压缩包。考虑到文件的更新和文章的灵活性。我将只写出文件的主要部分,将省去版本好和更新日期。
gcc-core | C语言编译器 |
gcc-c++ | C++语言编译器 |
mingw-runtime | MinGW的运行时库(这个必须安装) |
win32api | win32的API函数头文件和连接库 |
binutils | MinGW的汇编器和连接器等基础工具 |
gdb | MinGW中的调试工具 |
mingw32-make | Make工具,用以更好的管理你的项目 |
最后到DOS终端上,将当前目录转换成 $(MINGW)/bin 下。输入
C:\>gcc -v |
你可以从 http://www.mingw.org/download.shtml 上下载 MinGW5.0.2.exe 这个程序。至少,在我写此文的时候,这个是最新版本。
对于设置,我们只需要在环境变量中的PATH 变量中,添加$(MINGW)/bin这个路径就可以了。
Environment Settings
When you install command line tools, such as MinGW, or GnuWin32 tools, you have to tell the command line interpreter where to find them; this is usually accomplished by adding the appropriate directory names to the PATH variable in your environment. Typically, it isyour responsibility to do this; please do not expect the installer, (if you used one), to do it for you. If you use the GUI installer, it will create a start menu "Shell" shortcut that essentially sets up the path for you--following these instructions allows you to run it from the normal command prompt.
Warning: Adding entries to the PATH is normally benign. However, if you delete, you may mess up your PATH string, and you could seriously compromise the functioning of your computer. Please be careful.
- Right-click on "My Computer" and select "Properties".
- Click Advanced -> Environment Variables.
- In the box entitled "System Variables" scroll down to the line that says "PATH" and double-click the entry.
- You will be presented with a dialog box with two text boxes, the bottom text box allows you to edit the PATH variable. It isvery important that you do not delete the existing values in the PATH string, this will cause all sorts of problems for you!
- Scroll to the end of the string and at the end add ";
\bin". Here is the fullabsolute path name of the installation directory; if you accepted the defaults when installing tar and gzip, then for these, it will (probably) be C:\Program Files\GnuWin32, while for MinGW it will be C:\MinGW\bin, (if you kept to the recommended default installation directory). Don't forget the semicolon; this separates the entries in the PATH. - press OK -> OK -> OK and you are done.
Note that you may can also add C:\MinGW\MSYS\1.0\local\bin, and C:\MinGW\MSYS\1.0\bin to your path as well, if you want to be able to use bundled MSYS executables (replace with full path to your directories).
第三节 人在曹营心在汉的Cygwin
Cygwin可以从Cygwin的官方网站获得安装程序 http://www.cygwin.com/
在到了选择安装的组件时,在Devel 选项下,将gcc-core,gcc-g++ 等前的skip 点击成你所需要的版本号。
然后在 Lib选项卡中,将glib2,glib2-devel,glib2-runtime前的skip点成版本号。
$cd /cygdrive/d/ |
----------------
1. 先去Cygwin网站(www.cygwin.com)下载一个安装文件(setup.exe),这个文件体积很小,只有不到300KB。然后双击运行setup.exe。因为是第一次安装,所以必须选择从Internet在线安装,也可以先从Internet下载安装文件,然后再手动安装。我选择后者,因为这样,以后我可以在不联网的时候也能安装。
2. 接下来点击“下一步”,然后从一系列服务器列表中选择一个你认为网速最快的一个作为下载服务器。接着点击“下一步”就会出现如下图所示的界面,用来选择你想安装的程序。
如果你不做任何修改,将默认安装Cygwin运行所需的最少的程序和组件。不过,gcc编译器不在默认安装程序之列,所以你必须选择安装gcc。具体是, 在上述窗口中的列表中展开Devel目录,找到gcc-g++一项,点击“Default”,它就变成了“Install”,同时由于程序之间的依赖性 gcc-core条目的“Default”,也变成了“Install”。
此外,为了使gcc能正确编译源文件,还必须安装win32api库,否则会编译出错。因此,你需要在上述窗口中展开Libs目录,找到win32api一项,将它点成“Install”。
3. 接下来就是耐心等待程序去下载所需的安装文件了。一旦下载完毕,你再次运行setup.exe,先选择你将要把Cygwin安装在什么地方,然后再选择你 刚才所下载的那些安装文件所在的硬盘位置。接着你还需要再次选择安装gcc和win32api。这样,你就可以开始安装了。
4. 安装完成后,运行Cygwin。在窗口中敲入gcc就可以直接用gcc来编译了。编译链接生成的可执行文件,系统会自动加上.exe后缀,在Cygwin 环境中可以直接运行。但如果脱离Cygwin环境,而在MS DOS下运行,则会出错。解决办法很简单,那就是将cygwin1.dll文件拷贝到C:\WINDOWS目录下即可。
http://www.linuxidc.com/Linux/2007-12/9546.htm
第四节 脚踏两只船的Djgpp
Djgpp,可以从Djgpp的官方网站上下载 http://www.delorie.com/djgpp/
总体来说,这篇文章写的有些匆忙。所以可能有些地方有不足。所以,希望各位能够多多原谅批评和指教。下一章,我将介绍GCC for Win32的IDE。同时,从这一章开始,我将向各位读者做一个小小的要求。那就是,希望你们能够将自己对这篇文章感到的不足告诉我,我将随时修改以发表的内容,以适合广大读者的要求。如果各位有什么想法或者意见,疑惑。希望您能到 http://blog.csdn.net/visioncat 上提出。
STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)
第二章 GCC的外衣——IDE环境
第一节 IDE for GCC概览
IDE,即Integrated development environment,也就是综合开发环境。对于习惯使用VC的windows程序员来说,在windows下,GCC的IDE也许就比较陌生了。所以,想通过这一章简单介绍一下GCC所使用IDE。
GCC的IDE是什么?
IDE,也就是 综合开发环境 。她是为了便于程序员开发,管理项目的软件。对于C/C++来说,她主要包括四个部分。代码编辑器,编译连接器,调试器和工具库。而GCC本身就包含了编译连接器,调试器和工具库。所以,严格的说,GCC的IDE主要功能就是一个代码编辑器,是用于编写代码的软件。
所以,从上面我们可以看到一个问题,那就是支持工具库的不是IDE,而是编译器。如果你使用不同的IDE开发项目,只要你使用的编译器是相同的,那么她就能支持相同的工具库。
Windows下的为GCC设计的IDE有那些?
许多GCC的IDE,毕竟不是商业化制作的,因此很多地方都有不足的地方。下面是我个人认为不错的几个IDE。
Dev-C++,这个IDE可谓是专门为GCC所设计的IDE。Visual-MinGW,一个模仿VC6.0界面的IDE。最后是最近最火的Code::Blocks,由于也是最近接触,所以也不是太了解,不过,给人的第一印象是,特别像VC.Net的界面。
总体来说,各个IDE都有其自身的特点。对于初学者,Dev-C++比较不错,因为各种工具库基本都有为Dev-C++设计的安装包。对于从VC转形到GCC的人来说,Visual-MinGW是一个不错的选择,因为据我所知,大家熟悉和喜爱的还是VC6.0居多,因此模仿VC的Visual-MinGW是一个不错的选择。对于打算用GCC开发项目的人来说,Code::Blocks的确会成为你的最爱,因为她的项目管理实在是太优秀了。其实,每个人都会从中找到适合自己的IDE。
本书的IDE
本书使用哪种IDE呢?其实,本书不是专门为哪种IDE所写的。因此,本书所写的都是针对GCC本身所写的。因此,本书中的IDE。其实就是windows下最不起眼的notepad。不过,为了书写便捷,我通常使用Emacs或者Notepad++来书写代码。Emacs是一个Unix环境下优秀的编辑软件,Notepad++是一个notepad增强版,个人感觉比较适合开发程序。本书会在每个例子程序后附带一个Makefile文件,通过这个文件各位就能够非常直接的了解到环境的配置方式,然后根据不同的IDE为你的程序添加不同的参数。
第二节 最专一的Dev-C++
简介
Dev-C++,全称Bloodshed Dev-C++,是由Bloodshed公司开发的一款C/C++的IDE。她所默认的编译器为MinGW,但是她能够支持Cygwin等其他任何GCC的移植版以及GCC本身。她是使用Delphi开发的,因此有些C/C++开发者觉得她的血统不纯。但是我个人认为,只要适合的,我们又何必在意她用什么开发呢?
获得与安装
Dev-C++,可以从她的官方网站 http://www.bloodshed.net 上获得。在官方网站的下载页上,你将会看到三个安装程序。下面我一一解释一下。
Dev-C++ with Mingw/GCC 这个是包含MinGW的安装包。安装这个包以后,你将拥有完整的一个IDE开发环境,自然包括编译器等。
Dev-C++ executable only 这个是只有IDE的安装程序,其中不包括任何编译器。所有,如果你没有安装GCC编译器的话,安装这个包以后你将会出现无法编译项目的问题。
Dev-C++ source code 这个是源代码包,当然其中只有Dev-C++的代码,没有任何GCC的代码。
通常偷懒的人选择 Dev-C++ with MinGW/GCC 这个包,这个也是我建议初学者安装的包。如果,你在上一章以后,已经安装了某个GCC的windows移植版,那么你可以选择Dev-C++ executable only这个包。如果你想研究一下Dev-C++的代码,并且对Delphi有所了解,那么Dev-C++ source code是你唯一的选择。
下面我对Dev-C++ executable only的安装方式进行说明。而Dev-C++ with MinGW/GCC的安装和她差不多,只是可以省去后面配置编译器的问题。
安装
首先,从官方网站下载Dev-C++。运行安装程序以后,您将看到如下的提示。
这个是让你选择安装时候所使用的语言这里,我们只能选择English,因为没有中文安装界面。
这个是许可证界面,选择 I Agree。感觉现在大家用盗版用多了,对于许可证都不关心了,可是我想作为一名开发者,应该对许可证的内容重视一下,毕竟你的软件也是要被人使用的。
这个是安装选项界面。其中,你可以选择你所要安装的内容和安装的一些选项,比如是否关联文件等。如果你下载的是 Dev-C++ executable only ,那么你将无法使用Mingw compiler system(binaries,headers and libraries) 这个选项,因为这个安装文件中没有包含这个。
这个界面是让你选择安装路径。你可以在这里选择你安装Dev-C++的路径。我这里假设你安装在$(DEV)下。
这个界面是询问你是否为windows上的所有用户安装Dev-C++。这里,我选择 否。如果你想让本地机上,每个用户都可以使用Dev-C++,那么你可以选择 是。
在安装程序结束后,默认会运行Dev-C++。你在首次运行时,会看到如下界面。
这个是选择你Dev-C++所使用的语言,界面图标和窗口风格。如图上选择,我们使用的语言是中文,使用New Look图标,并使用XP风格的窗口。
这个是询问你是否要Dev-C++提供函数补全功能,她将从头文件中读取函数头,然后为你补全。但是要消耗一定的CPU时间。如果,你的机器还可以的话,并且需要此功能那么你可以尝试一下。
至此,我们的Dev-C++算是安装成功了。如果,下载的是Dev-C++ with MinGW/GCC,那么后面的内容你可以不关心了。因为,你的IDE环境已经全都配好了。如果不是,那么您还需要自己安装编译器。
配置编译器
按照我第一章所介绍的,安装好某一个GCC移植版编译器,可以是MinGW,也可以是Cygwin。假设,您安装的目录为$(GCC),那么请将如下路径添加到系统变量 PATH 后。
$(GCC)\bin;
这样,你的Dev-C++就拥有了编译器了。当然,你也可以从Dev-C++的网站上下载MinGW全套的Dev包,然后用Dev-C++带的包管理程序安装MinGW。
添加新的工程类型
在平时,我们通常会建立自己的工程文件。但是,如果每次都要自己设置环境变量,编译器参数未免也太麻烦了。本处就要介绍,如何将自己定义的工程类型,添加到Dev-C++的新建工程选项里。就如下图所示,
Dev-C++的项目模板文件,保存在安装目录的Templates目录下。文件以template后缀结尾,你可以用记事本打开。下面我们一起来建立一个自己的项目。
在templates目录下新建一个名为MyProject.template的文本文档。内容如下:
[Template] ver=1 Name=MyProject Icon=0 Description=一个小小的测试 Catagory=HOME [Unit0] CName=main.c C=MyProjectC.txt [Unit1] CName=myProject.h C=MyProjectH.txt [Project] UnitCount=2 Type=1 IsCpp=0 Compiler=-DPASSWORD Linker=-O2 Name=My Project ProjectIon=0 |
[Template] | 标签后的内容是对项目的介绍。 |
Ver | 变量是Template文件的版本,这边默认是1不要更改。 |
Name | 变量是项目的名称 |
Icon | 变量是项目图标的路径,如果没有那么就写0 |
Description | 变量是对这个模板的介绍。 |
Category | 变量是这个项目属于哪种项目,这里我们自己建立了一个名为Home的类型。 |
[Unitx] | 其中x为从0开始的任何整数,是定义项目中所包含的文件。 |
CName | 变量是说明这个文件在项目保存时默认的文件名。(C语言时使用) |
C | 变量是Cname文件的源文件。(C语言时使用) |
CppName | 变量同Cname变量,只是在C++语言时使用。 |
Cpp | 变量同C变量,是在C++语言时使用的。 |
[Project] | 标签是对工程的总体介绍 |
UnitCount | 变量是说明整个项目有多少文件,从1开始。 |
Type | 变量是告诉IDE这个项目采用何种编译方式。0为windows窗口程序,1为控制台程序,2为静态连接库,3为动态连接库。 |
IsCpp | 变量是说当前项目是否只能使用C++语言,0表示不是,1表示是。 |
Compiler | 变量是编译器参数 |
Linker | 变量是连接器参数 |
Name | 变量是项目的名称 |
ProjectIcon | 变量是项目编译以后,主程序的图标文件。 |
下面给出了MyProjectC.txt和MyProjectH.txt的内容。
//MyProjectC.txt #include #include #include "myProject.h" int main(int argc,char *argv[]){ printf("%s\n",S); return(0); } |
//MyProjectH.txt #ifdef PASSWORD #define S "Hello World" #else #define S "NO PASSWORD" #endif |
重新启动Dev-C++,在你的项目中就存在了我们的项目。
最后的内容
相对来说Dev-C++的功能还是比较简单的。而且,界面也是属于中文的。所以,慢慢摸索你一定可以熟悉这个环境的。
文外音:
总的来说,Dev-C++是一个不错的IDE。很适合对GCC不是太了解的人使用。当然,这里我还是要表示抱歉,因为最近要忙于考试,所以迟迟没有推出这篇文章。现在经历了漫长的考试时间,我在放假的刚开始,就匆匆写出了一些,赶紧贴出来。这里我还是希望各位能提出一件和疑问。如果各位有什么想法或者意见,疑惑。希望您能到 http://blog.csdn.net/visioncat 上提出。谢谢。
STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)
第三节 最脸熟的Visual-MinGW
简介
Visual-MinGW 是一个专门为MinGW所设计的IDE。如果,你曾经用过VC++ 6.0这个IDE,你的第一感觉就是,Visual-MinGW和VC++ 6.0非常相似。所以,对于曾经用惯VC的朋友们来说,Visual-MinGW不失是一个好的选择。然而,Visual-MinGW的开发与更新似乎并不积极。因此,还有不足的地方。Visual-MinGW的理念是提供一个高效的,快速的创建代码的IDE。
获得与安装
Visual-MinGW可以从他的官方网站http://visual-mingw.sourceforge.net获得。在官方网站上,您将看到有Development和Visual-MinGW两个下载选项。这里,我只以Visaul-MinGW的下载项为例。Visual-MinGW是一个不包含MinGW编译器的安装程序。
安装
首先,从官方网站下载前面所说的安装程序,然后运行。基本的安装步骤和Dev-C++类似。由于没有什么选项。我们这里就不一一举例了。
接着,我们运行Visual-MinGW。在第一次运行时,我们将看到如下对话框。
这是询问你,是否关联相关文件。也就是让Visual-MinGW成为默认的文件编辑器。
这个对话框是告诉你,需要将MinGW的目录设置进你的Compiler目录。
如果,你安装了MinGW。那么你在这里就可以设置了。我假设,你的MinGW安装在$(MinGW)目录下。那么在Compiler Path前打勾,并将$(MinGW)添加上去。
如此,你的Visual-MinGW就算设置好了。如果,你没有安装MinGW,那么你可以查看第一章的内容。这里,我就不多做介绍了。
配置
如果,你需要改变编译器所在的目录。可以使用如下方法调用设置界面。
在菜单栏选择 File -> Preferences.. -> Environment 这样,你就开启了设置界面。这里的设置,和第一次运行的设置一样。
使用
其实,Visual-MinGW的使用方式和VC非常类似。基本熟悉VC的朋友。一定对Visual-MinGW不会陌生的。所以,在这里我就不详细介绍了。不过,可惜的是,Visual-MinGW似乎不能添加自己的项目类型。所以,这也给我们带来了不少不便。
第四节 最新颖的Code::Blocks
简介
Code::Blocks不只是GCC的一个IDE,也可以支持其他的编译器,比如 MS-VC,Borland C++等等。所以,总体来说Code::Blocks并不是某个编译器的特属IDE。Code::Blocks的界面设计很像VC.net的界面。从效果上看的确不错。而且,这个IDE支持插件功能,你可以从他的官方网站上获得这个IDE的插件和相关的帮助。
获得与安装
Code::Blocks你可以从他的官方网站 http://www.codeblocks.org 获得。在官方网站上,有两种版本下载,一种是带编译器的,一种是不带的,我们可以从文件的体积来分辨这些。这里,我下载的是不带编译器的。当然,带编译器的安装方式也类似。
安装
在网上下载Code::Blocks后,双击运行安装。
上面是安装的欢迎界面
这个是Code::Block的许可证界面。这里,软件用了GPL,这就说明你可以免费使用和传播。
这个是询问你安装的路径,你可以选择自己喜欢的路径。
这个是询问你安装的模式,因为软件也不大,所以如果你的硬盘空间有空余的话,就选择完全模式吧。
这个是安装前的确认,如果没有什么问题的话,他将开始将Code::Block安装到你的机器上了。
在一系列的安装后,你将看到如上的界面。提醒你已经安装好Code::Block了。Launch Code::Block意思是马上运行Code::Block。
配置
在第一次运行Code::Block时,她会询问你所使用的编译器种类。如果不是有特殊要求的话,我这里选择GNU GCC Compiler。如果你一开始选错了也没有关系。
由于,我们安装的是没有编译器的版本。所以,我们这里必须安装编译器,具体的安装方式,可以参照前面的文章。这里,建议安装MinGW。现在我假设你的编译器安装在了,$(MINGW)目录下。
运行Code::Block,在菜单中选择 Build -> Compiler Options。调出编译器配置框。
如图所示,这个就是编译器选项,我们这里使用的是GCC所以,在最开始选择。GNU GCC Compiler。说明你选择使用的是GCC。
然后选择Programs选项卡,设置我们MinGW的路径。
在Compiler's installation directory中添加你MinGW的路径,按照上面的定义他应该是$(MINGW)。注意别把bin目录包含进去。如果你只安装了C语言编译器,并且你只使用C语言编译器。请将Linker for dynamic libs中的mingw32-g++.exe改为mingw32-gcc.exe。
至此,我们已经顺利完成Code::Block的安装与配置了。如果,你选择的是带编译器的版本,那么你可以忽略配置部分。
使用
总体来说,Code::Block的使用还是比较显而易见的。对于有一些编程经验的人,使用Code::Block并不是一件非常困难的事情。当然,Code::Block可以建立自己的项目模板。具体的做法和Dev-C++类似。您可以查看$(CodeBlocks)/share/CodeBlocks/templates目录中的文件。
最后的内容:
总体来说,这次介绍的两个IDE总体来说还是不错的。不过,笔者使用最多的还是Dev-C++。对于Visual-MinGW和Code::Blocks我了解并不多。前者是因为并不太喜欢,后者是由于刚出来。不过,还是希望我写的内容对各位有用。当然,我个人的喜好不会影响各位的使用。现在笔者没有使用其中任何一款IDE,笔者现在使用的IDE是我自己架设的,在Windows下我使用的是notepad作为我编写代码的工具,使用Makefile管理项目。所以,各位可以放心的选择各自喜好的IDE。不用担心会不被支持,或者被厌弃。至此,关于IDE的介绍将就到这里结束了。以后我将主要针对函数库本身做详细的介绍,并提供教程。
文外音:
首先,对各位读者表示抱歉。因为原本我准备趁着这次暑假多写一点东西的。可是,并没有预期的那么好。原本这篇文章应该在上个月写出来的。可是,上个月为了练习编程技巧,写了个Sudoku Puzzle,因此没能有时间写文章了。如果各位想要的话,可以问我要。那个程序原本预计一周完成的,可是没想时间远远超出了我的预计。后来,八月初才完成的。本想可以写了吧,没想又发起高烧了,结果久久没能写出文章,对各位对我的期望,我表示非常抱歉。如果你对于文章有什么意见,疑惑或者问题,可以到http://blog.csdn.net/visioncat上提出。我尽我所能将在第一时间回答您。
STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)
第三章 GCC粗探——GCC的组成与附加参数
第一节 GCC的家族成员
总的来说,GCC应该是一个编译器。可是,为什么我还要在这里介绍GCC的家族成员呢?其实,整套的GCC环境并不是由GCC构成的,他是由多个包所组成的。这些包的互相作用产生了GCC的开发环境。其中,有一些包是你开发应用程序所必备的基本包。离开这些包你将无法正常使用GCC。
GCC的基本包列表。
GCC的基本开发环境,主要由一下几个包构成。Binutils,这个是辅助GCC的工具包,里面包含了连接器,汇编器,动态静态库生成程序,等等。GCC,这个包是GCC本身。当然GCC包中还包括一下几个包,如core,java,ada等,每个包都代表了一种语言。然后,就是win32api,mingw-runtime,这个是在Win32下使用的标准函数包。如果,你使用的是Cygwin或者是在Unix环境下,那么这个包就是GlibC。
所以,由上所述。GCC的基本包有:binutils gcc glibc/[win32api,mingw-runtime]有了这些包。你基本能够开始编译应用程序了。
当然,如果说你想要写一个小程序。自然这些包已经够了。但是如果你要写一个较大的工程。那么,这些包也许就不能很好的胜任你的工作了。因为,对于一个大的项目,需要编译的文件不只一个,而且还有依赖关系等等。
所以,GCC中还包括gmake包用于管理项目。当然,还有automake。但是我个人还是不太喜欢automake,automake其实是帮助你自动的管理你的项目,当然实现这个自动也是比较麻烦的,所以与其用automake管理中小型项目,不如用gmake自己写个脚本。不过,automake通常用于源代码发布的应用,如果在开发时使用会延长开发周期。
Gmake,automake,都是通过编译脚本来批量的编译程序。他们能够更具你所给定的依赖关系,来自动的判断需要重新编译的源代码,然后编译。这点的确可以帮助开发人员减轻不少的人力和开发周期。比如,你用Makefile管理一个项目,那么在你第一次编译程序以后,如果你的源代码没有做过任何编辑,那么下次再调用gmake的程序时,gmake就不会再去一一编译每个文件。而是简单的连接一下主程序,或者什么都不作的退出(这要取决于你写的Makefile脚本)
但是,对于有些开发人员来说,上面这些包还是不能满足他们的要求。因为他们要调试程序。所以,GCC还包括另一个包。那就是GDB,gdb是GCC开发的,用于跟踪调试的,命令符型调试器。它的功能还是比较强大的。基本,你能在VC下做到的,GDB也可以。不过,GDB的命令还是比较多的。掌握一些基本的调试命令一般就够使用了。
总结
GCC开发环境包括如下几大包。
binary | 基本包 | 提供基本的汇编器,连接器等 |
gcc | 基本包 | 各种语言的编译器,包括C,C++,Ada,Java等 |
Win32api,mingwi-runtime/glibc | 基本包 | 系统函数库 |
Gmake/automake | 需要包 | 管理项目编译的程序 |
gdb | 附加包 | 调试程序 |
第二节 GCC的常用编译参数
同VC,TC等编译器不同,GCC其实是可以很方便的在提示符下编译程序的。GCC在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。
不得不承认,不懂GCC编译参数的人,确实会损失一些GCC的强大功能。所以,我下面简单介绍一下GCC的一些基本编译参数。这里,我以C编译器为例。
编译二进制代码
$gcc -c yours.c -o yours.o |
使用这段指令,GCC将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。
编译最简单的小程序。
$gcc -o yours yours.c |
通过这条指令,GCC将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。
编译时将自己的头文件目录设为默认头文件目录
$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o |
这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include
编译时使用自己的静态库存放目录
$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o |
这条指令将会让GCC在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。
编译时使用静态连接库
$gcc -lyour_lib -o yours yours.o |
这条指令将会让GCC在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,GCC所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。
编译时使用优化
$gcc -O2 -c yours.c -o yours.o |
使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。
编译时显示所有错误和警告信息
$gcc -Wall -c yours.c -o yours.o |
GCC在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)
编译连接时,加入调试代码
$gcc -g -o yours yours.c |
正如同VC有debug编译模式一样,GCC也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。
连接时缩小代码体积
$gcc -s -o yours yours.o |
这个参数,似乎我没有在Unix环境下看到过。也不知道具体什么作用。因为有人说Visual-MinGW生成的代码小,于是研究了一下她的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。
获得帮助
$gcc --help |
这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。
第三节 如何写一个简单的Makefile
说了半天Makefile管理项目,我想现在该说一下如何写了。其实,Makefile文件总体还是比较容易写的,基本只要你会使用命令行,就可以写Makefile。下面我简单介绍一下Makefile的构成和书写。
一个输出 HelloWorld 的简单Makefile
all: echo HelloWorld |
这个Makefile代码,运行后将在屏幕上打印一个HelloWorld。all其实是类似C代码中的main函数。gmake程序将在运行Makefile代码时,首先运行此处的代码。注意,此处echo前面的是
添加依赖项的Makefile
all:depend @echo I am the main depend:closeecho @echo I am the depend closeecho: @echo off |
这个Makefile代码,的作用还是输出句子。不同的是她添加了几个指令块之间的依赖关系。其中all依赖于depend,depend依赖于closeecho。这样,程序在编译时将根据脚本的依赖关系来判断文件编译的先后顺序。
执行Makefile
$make -f Makefile |
通常情况下,不用-f参数,make程序将在当前目录下搜索名为Makefile的文件作为需要执行的文件。而使用-f将指定Makefile的文件名。
一个完整的Makefile
all:yours @echo OK yours:yours.o gcc -o yours yours.o yours.o:yours.c gcc -c yours.c -o yours.o |
更多有关Makefile的详细内容请查相关资料。
文外音:
的确,发现了。我这个系列的文章进展的并没有我预期和承诺的那么快。确实挺让我感到无奈的。不过,幸好你能够理解我。总体来说,本文主要是简单介绍一下GCC的一些基础。因为我发现有许多读者对GCC并不是很了解。
说来也挺无奈的,最近发现原来周围有个小人当道。此人姓名我也就隐去了。从去年开始,就常常在和我聊得比较好的几个女生面前造我的谣。所以,原本应该9月该出来的文章拖延到了9月底。说起这个人,我希望大家要以此人为鉴。不要像他那样。
这人自称在硬件方面很行,不过据我所知,他无非就是可以把各种型号的主板和硬件编号背出来而已。连基本的线程进程都搞不清楚。还成天鼓吹32bit的机器是淘汰的机器。不得不承认,这位满口脏话为人无耻的家伙的确硬件方面挺不错的。但是,我还是觉得做技术的人不要太追求表面的东西,不要追求过于超前的东西,同时也更要注意自己的品行道德。
也许是年纪大了,发了一些牢骚。希望各位不要建议。不过,事以至次,我也无力挽回了。
最后感谢各位对我的支持,更感谢那些愿意为我效力的朋友们。同时,如果您有什么问题或者建议,都可以提出来。为了您能及时准确的得到回复请到http://blog.csdn.net/visioncat上发表你的留言。谢谢
STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)
第四章 跨平台图像显示库——SDL
第一节 与SDL第一次亲密接触
SDL,也就是 Simple DirectMedia Layer 是一个针对 声音,键盘,鼠标,遥杆,通过OpenGL的3D以及2D处理的底层跨平台函数库。她主要支持的平台有Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, 和QNX. 。当然,还有一些非官方的支持平台。
总体来说,SDL对于图像的处理性能还是不错的,而且能在基本不修改代码的情况下,能支持多平台的编译。这点的确是非常不错的。如果你想开发什么跨平台的游戏之类的,SDL确实是一个不错的选择。其次,SDL是用C写的,所以也可以得到很多其他语言的支持,主要有Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, 和 Smalltalk
SDL的官方网站是 http://www.libsdl.org 我们可以从她的官网上免费获得其源代码和编译成功的库。其他的还有一些Demo,文档,基于SDL所扩展出来的库,成功的案例等等很多SDL的资料。
SDL的使用概览
在正式使用中SDL的易用性也是显而易见的。通过一些简单的代码便能够编写出图形的显示程序。而且,SDL的编程思想也是很容易理解的。
SDL的程序代码主要有四部分组成。她们分别是 初始化阶段,程序运行阶段,事件等待与处理阶段,资源释放阶段。
初始化阶段,主要完成程序的初始化工作。如SDL的函数初始化,还有程序自身的一些初始化操作,如窗口的建立,背景色的设置,等等。程序运行阶段,主要完成程序中所需要的媒体载入,和显示等,比如窗口的初始化内容的刷新等。事件等待与处理阶段,主要是用于等待窗口 键盘 摇杆 鼠标等事件然后更具程序所设定的进行相关的操作处理。资源释放阶段,主要用于释放程序中所用到的系统资源,如image图片资源的释放等。
这四个阶段的代码是非常容易实现,而且有一定的格式和方法。所以,相对来说虽然SDL的功能强大,但是代码的编写也还是比较清晰和简便的。
SDL库的编译与安装
SDL的安装分为两种,一种为从源码编译出库,然后安装。另一种是直接使用官网上为我们编译好的SDL库。下面我一一介绍不同的安装方式。
我们先来看看从源码编译安装的过程。
我们要从SDL的官方网站下载 SDL-1.2.x.tar.gz 。然后从MinGW的官方网站上下载MSYS-1.0.10.exe和msysDTK-1.0.1.exe。第一个为SDL的源代码,第二个和第三个为MinGW的POSIX接口。如果你准备在Cygwin下编译,那么第二,第三个包就不需要下载安装了。
解压缩源码包到一个目录下,然后开启你的SH,切换到你SDL源代码所保存的目录下。然后输入如下的一组命令。
$./configure $make |
上面两条指令就让你的GCC编译出了SDL。如果你使用的是MinGW,那么可以将include,lib,bin目录复制出来。这里我假设我们复制到 $(SDL) 目录中。如果你使用的是Cygwin,那么你需要输入如下命令让Cygwin自动安装。
$make install |
当然,MinGW也是可以通过这种方式安装的。这样,SDL将安装入MinGW的MSYS安装目录中。
你也可以从官方网站上下载已经编译好的开发库。所要是SDL的开发库 SDL-devel-1.2.x-mingw32.tar.gz。将开发包里的东西解压缩到 $(SDL)目录中。
通过以上两种方式,我们就已经将SDL的开发环境正常安装到我们的机器上了。
当然,最后别忘记把SDL.dll这个文件复制到系统目录下,或者放在环境变量PATH所指向的一个目录中,亦或是你主程序所在的目录下。这样你的SDL程序才可以正常运行。
一个简单的SDL例子
下面给出一个SDL例子程序的源代码,以及他的Makefile文件,我们可以从Makefile文件中很直观的看到编译程序所需要的参数。
下面是C的例子代码
//main.c #include #include #include int main(int argc, char *argv[]){ SDL_Surface *screen; SDL_Event event; int isRun=1; SDL_Init(SDL_INIT_VIDEO); screen=SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); SDL_Flip(screen); while(isRun){ SDL_WaitEvent(&event); switch (event.type){ case SDL_QUIT: isRun=0; break; } } SDL_FreeSurface(screen); return(0); } |
下面是Makefile文件。
#Makefile SDL_INCLUDE=$(SDL)/include SDL_LIB=$(SDL)/lib/ all: gcc -I$(SDL_INCLUDE) -c main.c -o main.o gcc -L$(SDL_LIB) -o main main.o -lmingw32 -lSDLmain -lSDL |
你所双击运行你所编译出来的程序,你将会看到一个类似于如下图所示的窗口。
上面那组代码的结构就是一个比较典型的SDL的代码格式。
初始化阶段
SDL_Surface *screen; SDL_Event event; int isRun=1; SDL_Init(SDL_INIT_VIDEO); |
程序运行阶段
screen=SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); SDL_Flip(screen); |
事件等待与处理阶段
while(isRun){ SDL_WaitEvent(&event); switch (event.type){ case SDL_QUIT: isRun=0; break; } } |
资源释放阶段
SDL_FreeSurface(screen); |
至此,我们有关SDL库的简单介绍就到这里了。其实,SDL还有很多东西。我们将在后面的章节详细介绍SDL的神气功能。
文外音:
感觉自从上一篇文章至今已经过去很久了。其实最近感觉蛮忙的吧。但我也不知道自己忙点什么。不过这些日子所经历的事情也很多,感悟也很多。但是,心情却被这些事情弄的很不好。也许正像我所说的,光来到世界,世界却因为黑暗不来接受光,反而弃绝光。可如今作为一个普通人的我又能怎么样呢?争取我所爱的?还是等待所爱的?我向来不喜欢和人争,总认为该是我的,总会是我的,不该是我的怎么努力也是无用的。可是如今我却觉得也许我错了吧。呵呵,不游戏,不抽烟,不喝酒的我看来真的只适合搞搞技术什么的吧。
最后还是感谢各位一直以来的支持。同时,如果您有任何的问题和建议都可以提出来。为了您能及时准确的获得回复,请到http://nirvana.cublog.cn上,或者http://blog.csdn.net/visioncat上发表你的留言。谢谢。当然,还要为我那么长时间没来更新表示歉意。
NERVE软件开发组(NDT)
NERVE Development Team
北斗星君(黄庠魁)
第四章跨平台图象显示库——SDL
第二节函数库的详细介绍——基本函数
在上一节中,我们已经了解了SDL的安装和基本的使用方法。还给出了编译使用SDL程序的源代码。接下来,我将带领各位深入SDL其中,逐一介绍SDL的各个函数。首先我们先从基本函数说起。
当你需要在你的程序中使用SDL的时候。你首先要做的事情,就是在你的程序中初始化SDL。这个工作,你可以交由SDL_Init函数来做。SDL_Init函数可以初始化任何SDL所支持的子系统,其中包括图象,声音,摇杆,时钟等子系统。当然,在你使用SDL_Init函数初始化以后,你可以使用SDL_InitSubSystem和SDL_QuitSubSystem函数来加载和卸载子系统的。当然啦,你的程序退出前,你必须卸载所有的子系统以释放系统资源。通过调用< /font>SDL_Quit,可以轻松的卸载掉你所加载的子系统并释放这些子系统的系统资源。
SDL_Init
函数摘要
#include“SDL.h”
intSDL_Init(Uint32 flags);
函数介绍
这个函数是用于初始化SDL的,你必须在调用其他的SDL函数之前调用该函数。其中flags的参数和意义如下。当你需要初始化多个子系统的时候,可以用把这些参数或起来。
SDL_INIT_TIMER | 始化 计时器子系统 |
SDL_INIT_AUDIO | 始化 音频子系统 |
SDL_INIT_VIDEO | 始化 视频子系统 |
SDL_INIT_CDROM | 始化 光驱子系统 |
SDL_INIT_JOYSTICK | 始化 摇杆子系统 |
SDL_INIT_EVERYTHING | 初始化以上全部的子系统 |
返回值说明
返回 -1表示错误,返回 0表示初始化成功。
SDL_InitSubSystem
函数摘要
#include“SDL.h”
intSDL_InitSubSystem(Uint32 flags);
函数介绍
在你通过 SDL_Init为SDL初始化以后,你可以通过SDL_InitSubSystem函数来初始化那些没有被初始化的子系统。其中flags的参数定义和 SDL_Init的一样。
返回值说明
返回 -1表示错误,返回 0表示初始化成功。
SDL_QuitSubSytem
函数摘要
#include“SDL.h”
voidSDL_QuitSubSystem(Uint32 flags);
函数介绍
SDL_QuitSubSystem函数可以卸载你曾经通过 SDL_Init或者 SDL_InitSubSytem函数加载的子系统,其中参数 flasgs的定义和 SDL_Init中的定义一样。
SDL_Quit
函数摘要
#include“SDL.h”
voidSDL_Quit(void);
函数介绍
SDL_Quit函数可以卸载所有你所加载的子系统,并且释放这些子系统所占用的资源。这个函数一般是在程序退出以前调用的。< /font>
SDL_WasInit
函数摘要
#include“SDL.h”
Uint32SDL_WasInit(Uint32 flags);
函数介绍
SDL_WasInit函数,允许你查看你所加载的子系统有哪些。其中flags的内容为你所要检查的子系统。
返回值说明
函数返回一组你所要检查的子系统加载情况的说明。是几个bit字的或。你可以用与操作来逐一检查你所要检查的子系统是否被加载。
下面给出一组关于以上函数的Demo代码,以及他的Makefile。
SDL_General_Demo.c的C代码
& nbsp;//NERVE Development Team #include #define NOTE(msg) printf("NOTE: %s\n",msg) int main(int argc,char *argv[]){ SDL_InitSubSystem(SDL_INIT_AUDIO); if(SDL_WasInit(SDL_INIT_EVERYTHING)&SDL_INIT_AUDIO){ SDL_QuitSubSystem(SDL_INIT_VIDEO); if(SDL_WasInit(SDL_INIT_VIDEO)){ SDL_Quit(); return(0); } |
编译SDL_General_Demo.c的Makefile文件。
& nbsp;#Makefile |
按照以上两个文件的编译,我们可以得到一个名为Demo的可执行程序。当你执行 Demo以后。你将在Demo所在的文件夹内找到一个名为stdout.txt的文件。他是对 标准输入输出的重定向文件,你使用printf打印到终端的内容全部保存在这个文件内。下面是我的stdout.txt的内容
NOTE: load video subSystem |
文外音:
感觉现在的文章更新间隔是越来越长了,不过还是感谢各位对我的支持。我相信,我以后的文章更新会慢慢的加快节奏的。也同时感谢各位读者的支持和理解。呵呵,感觉一个学期又结束了,虽然在学期的结尾的时候和某个人发生了些不快。但是,我想我还是大度一点不和他计较了。同时我也觉得,人生中有很多事情是强求不来的,我们的一切都是早已在我们诞生以先就已经定下了,不论是我们在世上的疆界还是我们的财富。在上一阶段的时间里,我曾经充满希望,也曾经绝望过,但是不论何时我都觉得有种无形的力量在我绝望的时候扶助我,让我不至全然的扑到在地。如今,我真正觉得我曾经的绝望是如此可笑无知,因他让我见着希望~。所以,不论我们当前的处境如何绝望,只要抱着信心走在正直的道路上,我相信我们一定能看到曙光的。
如果你在阅读本文以后有任何的疑问,你可以到http://nirvana.cublog.cn或者 http://blog.csdn.net/visioncat上提出问题。最后感谢各位对我长久以来的支持。
NERVE软件开发组(NDT)
NERVEDevelopment Team
北斗星君(黄庠魁)
No comments:
Post a Comment