Wednesday, June 29, 2011

mac机器系统如何整理

Mac需不需要硬盘重组、清除快取文档?
macuknow.com/node/125
节录:
基本上来说,硬盘重组在Mac下面是不需要的

因为Mac采用的是HFS+硬盘格式,现在硬盘比以前不论在容量或技术都已经好很多,HFS+尽量不会去复写小区域的硬盘区块,换句话说就是他会把单一的大文档,尽量连续地写在空白区域的地方

另外,MacOSX 10.2之后都有支持延迟定址,意思是说会把一些零碎的小文档区块等到蒐集差不多的时候,再一起写入到一个大区域,其实这点就有点像随时在帮你做硬盘重组的动作了

如果你还是担心,或者是想安慰性的重组一下,有一套软件,叫做TechTool Pro 他有提供硬盘重组的选项


修复硬盘权限(我会每个月跑一次)
macuknow.com/node/118

因为Mac OSX是Unix-based的作业系统,硬盘权限就是每个文档的权限设定,有时候设定值会跑掉,造成你的作业系统执行起来怪怪的,或者让你感觉你的电脑变慢了一点点,这个时候,去&quot,修复硬盘权限&quot,通常就能解决问题。

打开你的硬盘工具程序
位置在应用程序&gt,&gt,工具程序&gt,&gt,硬盘工具程序
打开后,选择你自己电脑的硬盘,在&quot,修理工具&quot,的标签页下面,点选&quot,修复硬盘权限&quot,


另外你也可以用Yasu执行系统维护
最近载点:versiontracker.com/dyn/moreinfo/macosx/21674

介绍:oikos.com.tw/v4/viewtopic.php?id=2344
Mac 上协助执行系统维护或整理的工具很多,Yasu (Yet Another System Utility 的缩写) 就是其中一个,Yasu 的特点在於简单的界面及操作、却帮助使用者执行实际的维护工作,文档体积小、没有复杂的选项,但该执行的任务皆具备(定期维护、清除系统快取、浏览器快取、修复权限、更新 prebinding...等等)。

Tuesday, June 28, 2011

把在Linux中使用GCC开发的程序在Visual Studio+IVF中编译需要更改的地方

建立sublib的库文件sublib.lib:
  1. 根据sublib文件夹中的Makefile中提到的.o文件,加入这些文件到此IVF的工程中;
  2. .inc的需要include的文件需要放入到工程中,在属性-Fortran-General中,把.inc所在的目录加入到Additional Include Directories;
  3. 在源文件中注释掉的include的语句,需要取消注释,继续使用:efind.f,eowck.f,orbta.f,eptbl2.f,orbt1.f;
  4. 在IVF中循环语句使用的标号,比如rhead1.f中的8,只能用于循环,不能用于其它语句的goto跳转,所以这里goto跳转的标号需要与循环的标号独立;
  5. 属性-Fortran-Diagnostics-Check routine Interfaces 改为:No。
建立phasedit的库文件libphase.lib:
  1. 根据sublib文件夹中的Makefile中提到的.o文件,加入这些文件到此IVF的工程中;
  2. .inc的需要include的文件需要放入到工程中,在属性-Fortran-General中,把.inc所在的目录加入到Additional Include Directories;
  3. 属性-Fortran-Diagnostics-Check routine Interfaces 改为:No;
  4. 再Common里面声明的变量,在子程序中又重新以Local形式声明了,重复声明,应该把Local中的声明去掉,hasL1;
  5. 在read和write时,格式要加unit=,fmt=这两个就全加,否则就全不加,一个加一个不加会导致无法通过编译
  6. 在fmt=中的格式的书写形式不宜用//连接两个字符串的形式。
建立主程序prepmain:
  1. 根据prep文件夹中的Makefile中提到的.o文件,加入这些文件到此IVF的工程中;
  2. .inc的需要include的文件需要放入到工程中,在属性-Fortran-General中,把.inc所在的目录加入到Additional Include Directories;
  3. 在源文件中注释掉的include的语句,需要取消注释;
  4. 属性-Fortran-Diagnostics-Check routine Interfaces 改为:No;
  5. 内部函数MOD的自变量需要同种类型的,比如都是real或者都是integer,如果是不同类型,在IVF中不能自动转化,需要更改代码强制转化,比如这里需要把intrv强制转换成实型。
  6. 只需要把.lib文件加入到工程中就可以了,不用把.lib所在的目录放到linker-General,以及.lib的文件名放到linker-input就可以运行。

RightZoom程序与Adobe Pro冲突

经过实验发现,RightZoom与Adobe Pro冲突,会导致对于Adobe Pro的鼠标完全没法控制。选择文本出现问题,其中对于老板的Adobe 8 Pro 和新版的 X 10 都有类似的问题。

解决方法:可以在RightZoom中对于部分程序使用RightZoom而对于Adobe acrobat Pro这样的程序不要使用。

Monday, June 27, 2011

Mac快速修改文件名

当我们要修改一个文件夹或文件的名字的时候,需要先选中这个文件,稍作停顿后(避免被系统认为是双击),点击文件名,这时就可以对文件名进行修改了。但是有时候我们老是掌握不好停顿的时间,经常会变成双击打开了文件。其实, 只要在选中文件后,直接按Enter键,就可以马上进入文件名修改状态(这跟使用Windows的情况大不一样)

Sunday, June 26, 2011

新开一个 Finder 窗来方便在两个文件夹间拷贝文件

选择 Finder 菜单里的 “New Finder Window” ,或用快捷键 Command-N 。需要注意的是新开的窗默认会显示你的 Home 目录内容,如果要改变这个默认显示的目录,可以到 Finder->Preferences->General 内找到相关的选项。

按住 Command 键再双击目标文件夹或磁盘

进入菜单 Finder->Preferences,然后勾选 Always open folders in a new window。这样以后你只要双击文件夹,就会新开一个 Finder 窗口。

还有最后一招就是按窗口右上角的“传统风格切换”按纽,这时侧栏和工具栏就会消失,双击文件夹会新开一个 Finder 窗口,这就是所谓的Finder的传统模式。另外你可以通过快捷键 Option-Command-T 来启用,再按一次这个快捷键会恢复到原来的模式。在其他的软件(比如 Mail 和 Preview 你也会看到窗口右上角同样的按纽),按这个按纽也会把工具栏收起来。

MAC中查找你开启的窗口

单击Dock中的Finder,并按住不放,那么桌面上当前所有的窗口都暂时消失(除了Dock以外),其它则呈现阴影状,窗口陈列的则是Finder相关的所有窗口可供选择,对于其它应用程序也是一样.

长按dock上某图标或者用鼠标滚轮在图标上滚动。

ShowDesktop快速顯示桌面並將全部視窗最小化

  使用Windows的朋友們,應該對於顯示桌面不感陌生,當開一堆視窗或應用程式時,只要點一下顯示桌面圖示,所有的視窗就會全部最小化,並回到桌面中,但在MAC下卻會發現怎也找不到,回到桌面的圖示,雖然說可透過F11鈕將所有的視窗推出畫面四周,但視窗只是暫時被推出螢幕外而非最小化,當再按下蘋果鍵+Tab鍵切換視窗,全部就又通通跑出來,而現在只要透過ShowDeskop,就可讓MAC也能像Windows顯示桌面的功能,將所有的視窗通通最小化並顯示桌面。

Show Desktop小檔案:
工具名稱:Show Desktop
工具版本:1.6.4
工具語言:英文
工具性質:免費
適用平台:Mac OSX 10.3.9 +
官方網站:http://www.everydaysoftware.net/
本站下載:

Step1
下載完畢後,雙響並將ShowDesktop.app拖拉到應用程式中。

Step2
接著雙響ShowDesktop.app,開啟後再對著ShowDesktop圖示按滑鼠右鍵,選擇Preferences選項。

Step3
大至上沒什麼需要作設定,從Icon Style中可設定顯示桌面的圖示樣式。

Step4
按左上角的叉叉後,再選擇Quit就完成囉!

Step5
這時在畫面最上方就會看到顯示桌面的圖示。

Step6
點一下後,所有的視窗就會全部縮到最小化,並快速回到桌面。

  ShowDesktop還蠻方便的,如此一來當開太多視窗時,就不用一個一個最小化,直接點一下就可將所有的視窗縮到最小化,雖然說顯示桌面在Windows很好用也很實用,而好用的東西就要被保留下來,這對於使用者的我們只會變更加的方便,何樂而不為呢?

Mac一键最小化或还原多个窗口的快捷键技巧

如果你在苹果电脑上打开了多个窗口(比如N个Safari网页)怎么最小化多个窗口呢?一个一个地按最小化按钮或是双击工具栏?把这些最小化到Dock栏的的窗口一一还原回来同样会让你点到手抽筋。下面介绍一个Mac OS X系统下的小技巧:一键同时最小化或还原多个窗口。

首先,这里的多个窗口是指同一软件开启的多窗口--Safari和PhotoShop等软件可是Mac OS X系统上的窗口“高产户”。OK,按住“Option”键,再点击最小化按钮(或双击工具栏--我比较喜欢这种方法),怎么样,所有窗口同时最小化到苹果电脑Dock栏。

要同时还原多个已经最小化到Dock栏的窗口也很简单,按住苹果电脑的“Option”键,点击Dock栏里那一组窗口的任一一个,OK,这一组窗口全都还原了。

Saturday, June 25, 2011

Bootcamp 3.0读写Mac分区

现在的Bootcamp 3.0以后的版本,包括3.1,3.2,安装的windows系统都可以读取Mac下的HSF+形式的内容,但是为了避免出现文件格式的问题,目前还不支持写入。有的第三方软件支持写入,但是很不保险。

Friday, June 24, 2011

现IT企业使用windows编程多还是Linux编程多?

Linux 都是大企业的核心主机使用,桌面应用都是 Windows 。 所以这主要还是看你的发展目标。 Linux 的优势是可以运行在任何地方,手机、路由、乃至电视都可以作为你的开发平台。Windows 的优势还是传统桌面应用。

fortran中//表示什么

// 表示字符型量的合并,可以是字符型常量、变量、表达式。   如 'ABC' // 'DE'  即 'ABCDE'

Thursday, June 23, 2011

CORE10k.EXE

在下载的破解软件中除了破解软件外,还发现了这个应用程序,经过搜索发现,这个不是病毒。

CORE10k.EXE是破解组织CORE.NFO文件校验,也有程序报是病毒,破解组织CORE用来检验注册机是不是CORE原版的东西,有用的,是破解组织担心有人用捆绑的方式在注册机上安放木马病毒影响他们的声誉。

Fortran和C++的比较

我经常用Fortran,偶尔用C++,所以也想说两句,重点说Fortran相对于C++的优缺点(不对的话请不要拍砖)。

1.F 的数组确实是C++没有办法比的,虽然现在C++的Matrix class到处都有(Matrix class是底层类,所以代码重用性很好,医学的人 编的学土木的也能直接用),所以矩阵直接+、-、*、逆等运算Fortran不比C++强,唯一在此方面强的是F中可以随便拿出矩阵的一部分(行、列呀, 或行中的某几个数啊)然后再进行运算。C++的Matrix class目前还没这么灵活,或者至少写个长点的式子才行,不像F,A(3:5)一下就就搞 定了。对于外加库,现在F有的数值库,C++也都有相应的版本;

2.对于矩阵维数F也不比C++强,只是C++中你定义一个5维的矩阵,赋值就累死你了,此时就是要看看Matrix class里有没有大于2为数组的运算了;

3.运算速度:对相同问题F=1.2C++,这是很多研究者公认的,也是被检测过的。但是程序的运算速度和编译器,编写代码的习惯也有很大关系,所以一般人自己编程序感觉不到差别的;

4.代码重用性,F远不如C++,C++的面向对象确实比F强很多很多,F的面向对象还是大家的梦想,F2003确实很及时,如果F在5年之内还没有面向对象的功能,F的用户就走光了(我就是作有限元的,深有体会);

5.C++的编译器发展很快,主要是Microsoft强悍的支持,F的就不行了,2004年发布的2003标准都3年了,现在大家还是在期望之中;

6.关于高性能计算,F比较好,但是C(不是C++)也有类似于HPF的版本,叫UPC,所以两者实际上差不太多的(C也不是面向对象,F也不是,F比C稍快点),F95/2003中对并行的支持实际非常有限,F2008是个大的进步,但是不知何时才有编译器出来,呵呵;

7.C++可以开发软件的全部,而F只能作核心计算部分的编写。C++的数据类型要比F多好几种,并且现在复数运算在C++中也可以直接定义实现了;

8.内存垃圾F是不自动清除的,但是想在的C++好像可以自动清除(有点不确定),Java肯定是自动清除的,所以在这个层面来讲F比较弱;

9.除了数值方面,F都是在向C++学的;

10.F有大量可参考的代码,我感觉也不是什么优势,因为C++的可参考代码也很多,而且一个值得指出的地方是C++的代码都比较新;

11.还有要说的是F经常被说什么数据严谨、风格严格、当初设计就是为了数值计算的(要知道设计时是60和70年代,估计要还是当初的设计早就落后的不可就要了)等等等的,感觉其它语言也是这样啊,并不能把这一类的东西作为F的优点(因该说是不实在的优点 呵呵);

综上,F的优点是数组运算稍强于C++,速度比C++快,其它的都和C++持平或较差,我想这是个客观的评价吧!因为这两个小优点,我就一直用着F,当然面向对象和编译器的不好用也是俺的悲哀。

个人建议,作研究用F还是挺好的(上手快),如果想编商业化有限元软件还是C++是首选,这一点可以从近10年来新出现的数值分析软件中看出来(F2003可能会稍微缓解一下这个问题),牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的。

谢谢你的文章,让人获益匪浅。不过倒是有几个不同的意见。
1. Matrix Class没用过几个,毕竟我不是搞 数值计算的。但是因为C/C++中的数组看起变就像指针。因此如果“要拿出其中的一部份”来用,也是可以的比如说F中的A(3:5),如果它是表示拿出数 组的第三到第五个元素,在C++中可以直接用a+3来表示从第三个元素开始拿,而自己去控制拿到第几个元素。不过如果A(3:5)表示定义一个下标从3到 5的数组,那在C/C++中就没办法了。

2.给一个大数组赋值,在哪种语言里都累死人啊。。。

3.F=1.2C++,这点没看到过。不过应该也是可信的。毕竟F是以数值计算见长。^_^

4.5.F2003标准是面向对象的,只是很不幸现在鲜见F2003的编译器啊,这不是F的错。:(

6.看了你对F2008的评述,感觉F与C++的下一个版本C++0x好像都向着并行的方向发展着,这个要以后才能看到高下。^_^

7.C++中并不直接支持复数,还是要靠class。^_^这点不如Fortran,不过C99支持了,但是到现在我愣是没学会C99的复数该如何使用。。。

8.C++中仍然要自己管理内存,只是有了C++中class的保证,才让这个任务简单了些。这点二者都是一个德行。

9.这点可不敢说,一来对F不了解,二来怕人家喷我口水。。。。

10.F 的代码一般都是科学计算领域的吧?估计在科学计算领域,F很长时间内都不会消失。而C++代码中可以体现新近发展出来的模板元编程,泛型的好像不多,可能 是我见识少,只知道有boost/loki/bliz++/MPL是这样的。其它的库好像都只停留在class的中世纪。

11.风格倒是挺严谨,连不同用途的变量命名都有规定,开头有几个空格也有规定。这点真有点不爽。当初就是因为这个规定放弃了F的学习,毕竟从C过来的人写起程序来比较随意。。。

期待更完美的F编译器的出现^_^
不过不像C++那种大量应用到系统软件编程的语言,F只局限于科学计算领域,所以像MS这种公司是不大可能花力气到F上的。毕竟它面向的领域比较着重于科学计算,MS在上面赚不了钱,所以只有某些比较偏重学术或者看重运算速度的公司才会在上面花力气。^_^
不知道我讲的对不对。

谢谢大家的指教,对Fortran的能力总算有了点了解,谢谢大家。

比较喜欢lishhit的回答,非常中肯,很有功力,极为赞同。
做大型的程序还是C++比较容易维护,”牺牲点效率换回短时间的开发和维护(因为编译器好)是值得的“,这点我非常同意。


Fortran Functions and Subroutines

Functions and subroutines are FORTRAN's subprograms. Most problems that require a computer program to solve them are too complex to sit down and work all the way through them in one go. Using subprograms allows you to tackle bite size pieces of a problem individually. Once each piece is working correctly you then put the pieces together to create the whole solution. To implement functions and subroutines, first write a main program that references all of the subprograms in the desired order and then start writing the subprograms. This is similar to composing an outline for an essay before writing the essay and will help keep you on track.

Functions

The purpose of a function is to take in a number of values or arguments, do some calculations with those arguments and then return a single result. There are some functions which are written into FORTRAN and can be used without any special effort by you, the programmer. They are called intrinsic functions. There are over 40 intrinsic functions in FORTRAN and they are mainly concerned with mathematical functions.

The general way to activate a function is to use the function name in an expression. The function name is followed by a list of inputs, also called arguments, enclosed in parenthesis:

        answer = functionname (argumentl, argument2, . . .  

Example

PRINT*, ABS (T)The compiler evaluates the absolute value of T and prints it out
Y = SIN (X) + 45

The compiler calculates the value of sin x, adds 45 then puts the result into the variable Y, where x is in radians.

M=MAX(a,b,c,d)

The compiler puts the maximum value of a, b, c and d into the variable M. If a=2, b=4, c=1 and d=7, then M would have a value of 7.

C=SQRT ( a* * 2 +b* * 2 )The compiler evaluates the expression, a**2+b**2, sends that value to the SQRT function, and places the answer in the variable

As shown by the MAX function example above, a function may have one or more arguments but will only give one result. Also, as shown by the SQRT function example above, the argument for a function does not have to be a variable. It can be an expression or even a constant if you want to reference it again. One last item to remember, you must use result of a function call in an assignment statement or a PRINT statement, as shown in the examples above.

External Functions

The intrinsic functions in FORTRAN are useful but there will be a time when there is no intrinsic function to meet your needs. When this occurs you may write your own function subprogram.

You have to do one thing in the main program to use an external function. You need to declare the function name in the variable declaration section. Function names follow the same rules as for variable names: less than six letters or numbers and beginning with a letter. Because of this, function names should not be used as variable names. Once that is done and the function is written, activating it is just like activating an intrinsic function.

Now you are ready to write your function. There are a few rules for writing external functions:

  • Function subprograms and any other subprograms are placed after the END statement of the main program.
  • They are started with a line that includes the type of value the function will return, the function name, and the list of arguments the function takes as inputs.
  • Any variables the function uses, including the arguments, must be declared in the function right after the first line. The function name is not declared within the function.
  • You must use the function name in an assignment statement within the function. This is how the compiler knows which value to pass back to the main program.
  • A function must finish with RETURN and END statements.

Subroutines

You will want to use a function if you need to do a complicated calculation that has only one result which you may or may not want to subsequently use in an expression. Recall the external function example program where the average was called and then squared in one line. Subroutines, on the other hand, can return several results. However, calls to subroutines cannot be placed in an expression.

In the main program, a subroutine is activated by using a CALL statement which include the subroutine name followed by the list of inputs to and outputs from the subroutine surrounded by parenthesis. The inputs and outputs are collectively called the arguments.

A subroutine name follows the same rules as for function names and variable names: less than six letters and numbers and beginning with a letter. Because of this, subroutine names should be different than those used for variables or functions.

As with functions, there are some rules for using subroutines. Keep these in mind when writing your subroutines:

  • You do not need to declare the subroutine name in the main program as you do with a function name.
  • They begin with a line that includes the word SUBROUTINE, the name of the subroutine, and the arguments for the subroutine.

One way of indicating which variables are inputs and which are outputs is to put the inputs on the first line, use a continuation marker and put the outputs on the second line. See the example program for an application of this programming style.

All variables used by the subroutine, including the arguments, must be declared in the subroutine. The subroutine name is not declared anywhere in the program.

A subroutine is finished off with a RETURN and an END statement.

Wednesday, June 22, 2011

Windows下如何安装GCC?

第一章 在视窗操作系统下的GCC

第一节 GCC家族概览


GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。所以,也许对于许多Windows开发者来说,GCC还是一个比较陌生的东西。所以,我希望通过这章的叙述,让你——一个Windows开发者对GCC这一个优秀的编译器有一个大概的了解。


历史

GCCGNU公社的一个项目。是一个用于编程开发的自由编译器。最初,GCC只是一个C语言编译器,他是GNU C Compiler 的英文缩写。随着众多自由开发者的加入和GCC自身的发展,如今的GCC以经是一个包含众多语言的编译器了。其中包括 C,C++,Ada,Object CJava等。所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。也就是 GNU编译器家族 的意思。当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。

直到现在,GCC的历史仍然在继续,他的传奇仍然被人所传颂。


Windows下的GCC家族


起初,GCC是用于Unix,Unix-like系统的编译器。不过,现在Windows下也出现了GCC的稳定移植版。这要感谢Internet上众多程序员的共同努力。

如今,在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,CygwinDjgpp。虽然,Djgpp是应用于DOS系统的,考虑到windowsDOS的兼容,所以也将Djgpp纳入其中了。

总体来说,MinGWCygwinDjgpp各有特色,针对不同的应用场合,可以选择不同的移植版来满足需要。MinGW这个系列的移植,主要方向是让GCCWindows移植版能使用Win32API来编程。而Cygwin的目标是能让Unix-like下的程序代码在Windows下直接被编译。至于Djgpp,则是想让DOS下也能用上GCC
所以,对于开发人员不同的需求。选择合适的移植版会让工作变得轻松而高效。


本书的GCC


我个人对GCC的移植版都非常喜欢。不论是MinGW还是Cygwin,亦或是Djgpp。在本书中,除了特殊说明以外,所述的内容适合所有这三种移植版。
不过,考虑到现在在Windows下用的比较多的是MinGW系列。再加上MinGWCygwinDjgpp安装和使用更为简便。所以,建议读者学习时还是使用MinGW



第二节 入乡随俗的MinGW


简介

MinGWMinimalistic GNU for Windows 的缩写。她是一个建立在GCCbinutils 项目上的编译器系统。和其他GCC的移植版相比,她可以说是最接近Win32的一个了。因为,MinGW几乎支持所有的Win32API,这也是MinGW的特色之一。她所连接的程序,不需要任何第三方库就可以运行了。在某种程度上看,MinGW更像是VC的替代品。


获得与安装

MinGW可以从MinGW的官方网站 http://www.mingw.org 上获得。

如果,你要安装MinGW,那么你有两种安装方案。下面我来一一介绍。


安装方案一:

首先,你要从 http://www.mingw.org/download.shtml 上下载如下几个压缩包。考虑到文件的更新和文章的灵活性。我将只写出文件的主要部分,将省去版本好和更新日期。


gcc-core
C语言编译器
gcc-c++
C++语言编译器
mingw-runtime
MinGW的运行时库(这个必须安装)

win32api

win32API函数头文件和连接库

binutils

MinGW的汇编器和连接器等基础工具

gdb

MinGW中的调试工具
mingw32-make
Make工具,用以更好的管理你的项目


然后,将上述文件逐一下载,然后全部解压缩到一个目录下就可以了,我这里假设你是移动到$(MINGW)这个目录下了。这样,你的MinGW就算安装成功了。

最后到DOS终端上,将当前目录转换成 $(MINGW)/bin 下。输入


C:\>gcc -v


看到一段gcc的版本信息,这就能说明,你的gcc已经可以正常工作了。


安装方案二:

你可以从 http://www.mingw.org/download.shtml 上下载 MinGW5.0.2.exe 这个程序。至少,在我写此文的时候,这个是最新版本。

下载以后运行安装,至于安装过程,我想我就不一一介绍了。对于Windows下的开发人员,我想这个应该不是什么问题了。
在一切都选择好以后。这个程序就开始从Internet上下载所需要的压缩包。然后,逐一解开,安装。


总体来说,两种方法各有长处。不过,本人偏爱第一中方法。因为,控制度高,而且,更新也比较简单。自己心里也比较明了。


环境设置:


对于我们这些使用者来说,最好是能够简单方便的使用工具。所以,我们就需要设置环境,便于我们使用MinGW

对于设置,我们只需要在环境变量中的PATH 变量中,添加$(MINGW)/bin这个路径就可以了。


这样,你就可以在任何目录下使用MinGW了。


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.

  1. Right-click on "My Computer" and select "Properties".
  2. Click Advanced -> Environment Variables.
  3. In the box entitled "System Variables" scroll down to the line that says "PATH" and double-click the entry.
  4. 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!
  5. 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.
  6. 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).

http://www.mingw.org/


第三节 人在曹营心在汉的Cygwin


介绍


Cygwin,其实并不是一个GCC。她是让Windows拥有Unix-like环境的软件。所以,GCC自然也就会包含在里面。不过,对于开发者,Cygwin是一个开发环境。而对于用户来说Cygwin是一个运行环境。
Cygwin唯一和MinGW最大的区别在于,使用Cygwin可以在Windows下调用Unix-like的系统函数。比如进程函数,等等。所以,虽然说,Cygwin是运行在Windows下的,但是她还是使用的是Unix-like系统的函数和思想。


获得与安装

Cygwin可以从Cygwin的官方网站获得安装程序 http://www.cygwin.com/

在网站上下载Cygwin的安装程序setup.exe。然后运行便可以了。
关于前面的设置,我想不用多做介绍了。因为,对于这些我想Windows下的开发人员应该相当清楚了。

在到了选择安装的组件时,在Devel 选项下,将gcc-core,gcc-g++ 等前的skip 点击成你所需要的版本号。

然后在 Lib选项卡中,将glib2,glib2-devel,glib2-runtime前的skip点成版本号。

接下来,就点击next就可以了。在一段漫长的等待时间后,你的Cygwin开发环境就算安装好了。
相对来说,Cygwin的安装和配置都比较简单。因为,Cygwin提供了一个比较健全的安装程序。


使用


在安装目录下,运行cygwin.bat就可以启动cygwin环境了。这是一个模拟Linux的环境,所以很多地方可能和Dos有比较大的差距。不过,你编译出的程序可以直接在其他没有安装Cygwin的机器上运行。还有,如果要切换到windows下的其他盘下,比如D盘。那么就可以使用


$cd /cygdrive/d/


对于Cygwin更多关于使用的内容,你可以到Linux社区去获得参考。


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


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,是一个在纯Dos下的GCC移植版本。她使用一些软件将纯Dos设置成32位的环境,并运行由她编译出来的程序。总体来说,Djgpp并不是一个Windows的移植版。不过,她确实可以在Windows下运行。对于一些特殊应用。Djgpp是唯一适合的。


获得与安装

Djgpp,可以从Djgpp的官方网站上下载 http://www.delorie.com/djgpp/

不过,这里Djgpp为用户做了更好多的安排。她为用户提供了一个定制安装的页面。
您只需要在上面填写响应的内容,然后递交。她将会给你一份完整的安装方案。


使用


相对来说,Djgpp我并不是经常使用。所以,本文中在没有特殊说明情况下,不会使用Djgpp的。



文外音:

总体来说,这篇文章写的有些匆忙。所以可能有些地方有不足。所以,希望各位能够多多原谅批评和指教。下一章,我将介绍GCC for Win32IDE。同时,从这一章开始,我将向各位读者做一个小小的要求。那就是,希望你们能够将自己对这篇文章感到的不足告诉我,我将随时修改以发表的内容,以适合广大读者的要求。如果各位有什么想法或者意见,疑惑。希望您能到 http://blog.csdn.net/visioncat 上提出。



STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君
(黄庠魁)

第二章 GCC的外衣——IDE环境


第一节 IDE for GCC概览


IDE,即Integrated development environment,也就是综合开发环境。对于习惯使用VCwindows程序员来说,在windows下,GCCIDE也许就比较陌生了。所以,想通过这一章简单介绍一下GCC所使用IDE

GCCIDE是什么?

IDE,也就是 综合开发环境 。她是为了便于程序员开发,管理项目的软件。对于C/C++来说,她主要包括四个部分。代码编辑器,编译连接器,调试器和工具库。而GCC本身就包含了编译连接器,调试器和工具库。所以,严格的说,GCCIDE主要功能就是一个代码编辑器,是用于编写代码的软件。

所以,从上面我们可以看到一个问题,那就是支持工具库的不是IDE,而是编译器。如果你使用不同的IDE开发项目,只要你使用的编译器是相同的,那么她就能支持相同的工具库。

Windows下的为GCC设计的IDE有那些?

许多GCCIDE,毕竟不是商业化制作的,因此很多地方都有不足的地方。下面是我个人认为不错的几个IDE

Dev-C++,这个IDE可谓是专门为GCC所设计的IDEVisual-MinGW,一个模仿VC6.0界面的IDE。最后是最近最火的Code::Blocks,由于也是最近接触,所以也不是太了解,不过,给人的第一印象是,特别像VC.Net的界面。

总体来说,各个IDE都有其自身的特点。对于初学者,Dev-C++比较不错,因为各种工具库基本都有为Dev-C++设计的安装包。对于从VC转形到GCC的人来说,Visual-MinGW是一个不错的选择,因为据我所知,大家熟悉和喜爱的还是VC6.0居多,因此模仿VCVisual-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 这个包,这个也是我建议初学者安装的包。如果,你在上一章以后,已经安装了某个GCCwindows移植版,那么你可以选择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这个项目采用何种编译方式。0windows窗口程序,1为控制台程序,2为静态连接库,3为动态连接库。

IsCpp

变量是说当前项目是否只能使用C++语言,0表示不是,1表示是。

Compiler

变量是编译器参数

Linker

变量是连接器参数

Name

变量是项目的名称

ProjectIcon

变量是项目编译以后,主程序的图标文件。

下面给出了MyProjectC.txtMyProjectH.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-MinGWVC++ 6.0非常相似。所以,对于曾经用惯VC的朋友们来说,Visual-MinGW不失是一个好的选择。然而,Visual-MinGW的开发与更新似乎并不积极。因此,还有不足的地方。Visual-MinGW的理念是提供一个高效的,快速的创建代码的IDE


获得与安装


Visual-MinGW可以从他的官方网站http://visual-mingw.sourceforge.net获得。在官方网站上,您将看到有DevelopmentVisual-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并不是某个编译器的特属IDECode::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-MinGWCode::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。但是我个人还是不太喜欢automakeautomake其实是帮助你自动的管理你的项目,当然实现这个自动也是比较麻烦的,所以与其用automake管理中小型项目,不如用gmake自己写个脚本。不过,automake通常用于源代码发布的应用,如果在开发时使用会延长开发周期。

Gmake,automake,都是通过编译脚本来批量的编译程序。他们能够更具你所给定的依赖关系,来自动的判断需要重新编译的源代码,然后编译。这点的确可以帮助开发人员减轻不少的人力和开发周期。比如,你用Makefile管理一个项目,那么在你第一次编译程序以后,如果你的源代码没有做过任何编辑,那么下次再调用gmake的程序时,gmake就不会再去一一编译每个文件。而是简单的连接一下主程序,或者什么都不作的退出(这要取决于你写的Makefile脚本)


但是,对于有些开发人员来说,上面这些包还是不能满足他们的要求。因为他们要调试程序。所以,GCC还包括另一个包。那就是GDBgdbGCC开发的,用于跟踪调试的,命令符型调试器。它的功能还是比较强大的。基本,你能在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

正如同VCdebug编译模式一样,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代码,运行后将在屏幕上打印一个HelloWorldall其实是类似C代码中的main函数。gmake程序将在运行Makefile代码时,首先运行此处的代码。注意,此处echo前面的是GCC对空格很敏感的。


添加依赖项的Makefile

all:depend

@echo I am the main

depend:closeecho

@echo I am the depend

closeecho:

@echo off

这个Makefile代码,的作用还是输出句子。不同的是她添加了几个指令块之间的依赖关系。其中all依赖于dependdepend依赖于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 是一个针对 声音,键盘,鼠标,遥杆,通过OpenGL3D以及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.exemsysDTK-1.0.1.exe。第一个为SDL的源代码,第二个和第三个为MinGWPOSIX接口。如果你准备在Cygwin下编译,那么第二,第三个包就不需要下载安装了。

解压缩源码包到一个目录下,然后开启你的SH,切换到你SDL源代码所保存的目录下。然后输入如下的一组命令。


$./configure

$make


上面两条指令就让你的GCC编译出了SDL。如果你使用的是MinGW,那么可以将includelib,bin目录复制出来。这里我假设我们复制到 $(SDL) 目录中。如果你使用的是Cygwin,那么你需要输入如下命令让Cygwin自动安装。


$make install


当然,MinGW也是可以通过这种方式安装的。这样,SDL将安装入MinGWMSYS安装目录中。


你也可以从官方网站上下载已经编译好的开发库。所要是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_InitSubSystemSDL_QuitSubSystem函数来加载和卸载子系统的。当然啦,你的程序退出前,你必须卸载所有的子系统以释放系统资源。通过调用< /font>SDL_Quit,可以轻松的卸载掉你所加载的子系统并释放这些子系统的系统资源。

SDL_Init

函数摘要
#include“SDL.h”
intSDL_Init(Uint32 flags);

函数介绍
这个函数是用于初始化SDL的,你必须在调用其他的SDL函数之前调用该函数。其中flags的参数和意义如下。当你需要初始化多个子系统的时候,可以用把这些参数或起来。


< /tbody>

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_InitSDL初始化以后,你可以通过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.cC代码

& nbsp;

//NERVE Development Team
//SDL_General_Demo.c

#include
#include
#include

#define NOTE(msg) printf("NOTE: %s\n",msg)

int main(int argc,char *argv[]){
SDL_Init(SDL_INIT_VIDEO);
NOTE("load video subSystem");

SDL_InitSubSystem(SDL_INIT_AUDIO);
NOTE("load audio subSystem");

if(SDL_WasInit(SDL_INIT_EVERYTHING)&SDL_INIT_AUDIO){
NOTE("AUDIO SubSystem was loaded");
}else{
NOTE("AUDIO SubSystem is unloaded");
}

SDL_QuitSubSystem(SDL_INIT_VIDEO);
NOTE("unload video subsystem");

if(SDL_WasInit(SDL_INIT_VIDEO)){
NOTE("VIDEO SubSystem was loaded");
}else{
NOTE("VIDEO SubSystem is unloaded");
}

SDL_Quit();
NOTE("unload any subsystem of SDL");

return(0);

}


编译SDL_General_Demo.cMakefile文件。

& nbsp;

#Makefile
CC=gcc
SDL_INCLUDE="D:/SDL/include"
SDL_LIB="D:/SDL/lib"
all:SDL_General_Demo.o
$(CC) -L$(SDL_LIB) -o Demo SDL_General_Demo.o -lmingw32 -lSDLmain -lSDL
SDL_General_Demo.o:SDL_General_Demo.c
$(CC) -I$(SDL_INCLUDE) -c SDL_General_Demo.c -o SDL_General_Demo.o


按照以上两个文件的编译,我们可以得到一个名为Demo的可执行程序。当你执行 Demo以后。你将在Demo所在的文件夹内找到一个名为stdout.txt的文件。他是对 标准输入输出的重定向文件,你使用printf打印到终端的内容全部保存在这个文件内。下面是我的stdout.txt的内容


NOTE: load video subSystem
NOTE: load audio subSystem
NOTE: AUDIO SubSystem was loaded
NOTE: unload video subsystem
NOTE: VIDEO SubSystem is unloaded
NOTE: unload any subsystem of SDL


文外音:

感觉现在的文章更新间隔是越来越长了,不过还是感谢各位对我的支持。我相信,我以后的文章更新会慢慢的加快节奏的。也同时感谢各位读者的支持和理解。呵呵,感觉一个学期又结束了,虽然在学期的结尾的时候和某个人发生了些不快。但是,我想我还是大度一点不和他计较了。同时我也觉得,人生中有很多事情是强求不来的,我们的一切都是早已在我们诞生以先就已经定下了,不论是我们在世上的疆界还是我们的财富。在上一阶段的时间里,我曾经充满希望,也曾经绝望过,但是不论何时我都觉得有种无形的力量在我绝望的时候扶助我,让我不至全然的扑到在地。如今,我真正觉得我曾经的绝望是如此可笑无知,因他让我见着希望~。所以,不论我们当前的处境如何绝望,只要抱着信心走在正直的道路上,我相信我们一定能看到曙光的。
如果你在阅读本文以后有任何的疑问,你可以到
http://nirvana.cublog.cn或者 http://blog.csdn.net/visioncat上提出问题。最后感谢各位对我长久以来的支持。



NERVE软件开发组(NDT)
NERVEDevelopment Team

北斗星君
(黄庠魁)