Lccwin32 C Compiler【Lccwin32 C Compiler】LCC-Win32是运行于Windows9x/Me/NT/2000下的免费的32位C语言编译系统,他拥有一个功能强大的集成开发环境(IDE)、速度极快的编译器与连线器、方便顺手的调试器、资源编辑器和版本控制系统 。另外还提供图像编辑器和C语言源档案格式化缩进器等附加工具 。
基本介绍软体名称:Lccwin32 C Compiler
软体平台:Windows9x/Me/NT/2000
软体语言:C语言
属性:32位C语言编译系统
简介LCC-Win32是运行于Windows9x/Me/NT/2000下的免费的32位C语言编译系统 。另外还提供图像编辑器和C语言源档案格式化缩进器等附加工具 。通过它的应用程式嚮导,你可以单击几次滑鼠轻鬆得到一个应用程式框架,丝毫不比其它庞大的同类软体逊色 。你可以用LCC- Win32开发32位的控制台程式、Windows常规程式、动态连线库(DLL)以及静态连线库(LIB) 。LCC编译器支持标準的ANSIC,同时支持C语言的扩展 。通过下载相关工具,LCC-Win32还提供对Eiffel、Fortran语言的支持 。使用介绍声明本文没有任何明确的或者含蓄的表达说明本文是完全正确的,对于套用本文内容所产生的任何结果,本人概不负责 。请原谅本文在语言和语法的的运用上的错误,本人才疏学浅,这是不可避免的 。目录* 简介* 编译器的安装* Lcc-Win32的一些基本概念* 写个小程式!* 使用工程管理* 第一个Windows程式* 程式生成嚮导* 使用WeditRes创建资源* 添加其它类型的资源* 使用非规格资源* 静态库和动态库简介其实所谓的简介这个部分的内容趋向取决于作者 。但是我所读过的一些指南都是由一个“简介”开始的,这部分的内容通常都是在重複读者会在下面看到的东西,但是也有的简介只是作者的一些想法 。仔细的想一下,其实这个介绍并不是一件简单的事情 。首先,如果你要是开门见山的直奔主题,这是不礼貌的,而且基于web的指南也不应该有超大个的简介,不应该让读者在这个东西上浪费时间和金钱 。看来我的废话也够多的了,让我们切入正题 。这个指南是单页的,建议你等浏览器下载完毕后保存一份拷贝来离线阅读 。编译器的安装编译器的安装简单极了,只要把您下载的档案运行一下就OK了,应该不会遇到什幺问题 。但是注意安装的最后要编译库档案,可能要花点时间,要视你的机器速度而定 。Lcc-Win32的一些基本概念Lcc-Win32编译系统是由多个档案构成的 。它们的共同的任务是把文本格式的源代码编译位可以运行的二进制格式 。优良个重要的档案分别是编译器(lcc.exe)和连线器(lcclnk.exe) 。编译器是用来把你编写的文本翻译成处理器可以执行的格式的程式 。连线器用来转换编译器生成的二进制档案(通常叫做目标档案),并添加作业系统用来把程式调入内存并执行所需要的信息它可以把多个目标档案连结为一个单独的程可执行程式,这样就可以使你可以把一个程式的代码文档分割为几个模组,这个能力在你开发大型程式时是很重要的 。虽然这些听起来好像十分的简单,但是实际上并不是这个样子的 。编辑器和连结器需要你在命令行方式下键入你要建立的程式的所有信息,这将需要你记住大量的命令行参数和各种各样的开关,这时就需要IDE——集成开发环境(wedit.exe)来提供方便了 。IDE的基本功能是编辑文本,你可以在这个环境里编辑程式的原始码,但是远远不止有这个功能 。它还给你提供了一个调用编译器和连结器的简单方法,这样在编译程式的时候你就不用去记住那幺多的命令行参数了 。你可以简单的把Wedit想像成你的控制台,在这里你可以控制所有的流程 。好吧!现在你可以用你的滑鼠点一下Windows的“开始”按钮,在程式项的子选单了寻找“lcc-win32”,好了吗?现在你已经準备好在Lcc-Win32中写你的第一个程式了 。写个小程式!你知道吗?自从第一个C编译器产生以来(也许可能更早一些),有一个惯例就是为这个编译器写的第一个程式是“Hello World”,我为我拥有的所有编译器都写过,现在我们就来写一个 。第一步是创建源码档案 。在“File”选单中选择“new”项,然后在出现的对话框中输入“hello.c”并点一下“OK” 。现在你看到的是一个标题为“hello.c”的空白视窗,输入下面的代码:#include <stdio.h>void main (void){printf ("Hello World from LCC-Win32!\n");}保存我们的小程式,在“File”选单中选择“Save”项 。现在我们可以编译这个程式了 。选择“Compiler”选单中的“Compile hello.c”调用编译器 。这时一个新视窗会出现在IDE的底部,这是信息视窗,当编译器处理完成,在这个视窗中将会显示“HELLO.exe build successfully.”,如果编译出错,出错信息也将会被显示在这里 。如果编译出错了,在信息视窗处双击信息显示所在行,在编辑视窗内将高亮度显示出错代码行,仔细的检查一下你写的程式和上面我写的一样,这里需要注意的是C语言是大小写敏感的程式语言,这意味着“printf”和“Printf”对编译器是不相同 。现在你已经编译好了这个程式,按[Ctrl]+[F5]键运行一下,结果对吗?使用工程管理现在你已经编译了你的第一个程式,你可能想知道——执行档案在哪里?回答是:我也不知道!这可能听起来很傻(的确也是),但是这是看你在编译程式时的预设目录是什幺,所以你应该在你的硬碟里搜寻一个叫做“hello.exe”的档案 。你肯定不会想要每开发一个程式都要搜寻一下硬碟的,这种情况下你就要使用工程 。工程是一些编译器要知晓的建立程式所需要的信息 。这包括程式源档案、编译好的档案的存放地点、要编译为什幺类型的执行档,一个好的想法是为每一个程式建立一个工程 。事实上,对于我们的“HelloWorld”程式还是有一个工程的,Lcc=Win32会为没有指明工程的程式建立一个预设的工程 。选择“Project”选单的“Erase...”项,Wedit会显示一个工程列表,你会看到一个项目叫做“HELLO”,现在我们毫不留情的删除它 。与其他的编译器不同的是,Lcc-Win32的工程信息不是存储在硬碟上的,而是存储在Windows的注册表项里 。这使得Wedit可以“记住”所有的工程,甚至于在不同的磁碟上 。但是优势我们也需要清除我们不再使用的工程,在这种情况下,我们可以把工程信息导出到磁碟上,然后在IDE中删除它 。看一下“Project”选单的选项,你就会明白了 。现在你可以试着创建一个“HELLO”工程 。第一个Windows程式你可能已经注意到了hello.exe看起来象是一个DOS程式,但是它不是的,它是一个真正Windows程式,但是这种类型的程式被称为Windows控制台程式,就是在文本模式下运行的Windows程式 。如果你不相信,可以试着在Windows的纯DOS环境下运行一下,你会得到一行信息:“This program cannot be run in DOS mode” 。写一个真正的Windows版的“HelloWorld”程式并不比控制台的版本难多少 。首先创建一个新工程,选择“Windows executable”代替“Console application”,点OK后,Lcc-Win32会问你需要Wizard(生成嚮导)创建程式框架吗,回答No 。#include <windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){MessageBox (NULL, "Hello world from Lcc-Win32!", "Hello", MB_OK);return 0;}编译并运行这个程式,你会看到一个显示hello信息的视窗,点ok关闭退出 。不幸的是,除了这样的小之又小的Windows程式,一般情况下Windows程式是很複杂的,现在你已经知道了如何创建工程和编译程式,如果你是一个Windows编程新手,去 找一些有关的书来看看,取得必要的基础,一些Windows编程知识在下面的部分是必须的 。如果你是一个C语言的新手,那幺先好好的学一段时间再来看这个指南吧!程式生成嚮导Windows程式与文本状态下的程式比起来要好的多,但是天上不会掉馅饼的,你想要得到的Windows功能支持,比如:剪裁板、多任务等等要付出的是大量的複杂的代码 。但是总还是有些办法可以使事情变得简单一些的 。长时间以来,程式设计师们发现实际上总是有些在每个程式中都相同的代码段,所以Windows程式设计师通常使用模板来生成这部分代码 。就是说源档案一般只要生成一次,就可以在任何一个新程式中使用了 。只有变化的部分才是每个程式不同的部分,显然这些应该是可以自动的进行的 。这就是生成嚮导要完成的工作 。你可以在它的帮助下快速的生成应用程式的框架 。这个框架事实上就是一个什幺功能也没有的一个完整的程式,也许可能只是用来显示一个空窗体,因为使程式完成具体的功能是你的工作 。让我们看一下使用嚮导建立最简单的应用程式的处理 。通常,第一步是创建程式代码,然后建立一个工程 。在使用嚮导的模式下,你并不需要写一行代码,嚮导将为你建立它,我们直接来看建立工程各个步骤 。在“Project”选单下选择“create”项,给出项目名称和路径,选择工程类型为“Windows executable”,当Wedit询问你是否要使用嚮导(wizard),回答“yes”,这样就进入了嚮导模式 。嚮导将显示一个对话框叫做:“Application characteristics”,这是嚮导将在应用程式中包含的基本特点,你可以选择以下情况的一种:单视窗、多视窗和DLL(动态程式库),现在我们要创建一个十分简单的单视窗小应用程式,选择单视窗类型并确保所有的特性複选按纽都未被选中,点击“OK”进行处理 。现在嚮导将要提示你输入信息设定主视窗的“类”,这里所说的“类”和C++中的类是不同的,它是Windows在记忆体中存储的一个结构,用来存储正确显示视窗所需要的信息 。最重要的是“回叫函式”(下面将具体介绍)的名称,现在只要简单接受默认的属性值,点击“NEXT”进行处理 。这个“Generate code for the main window creation”对话框用来设定相应视窗的信息 。当主窗体被创建的时候这些信息会被传送到相应的视窗 。在这里你可以改变窗口的标题栏的显示内容,然后点击“Finish” 。嚮导的工作就要完成了,接下来的工程创建工作是通常的一些对编译器、连结器、调试器的一些设定,这里只要简单的接受预设的选项就可以了 。经过上面的步骤,就完成了嚮导的所有的工作,你可以在IDE中看到两个视窗,一 个是源程式编辑窗,另外的一个是用来定义应用程式的主选单的脚本 。正象刚刚所说的那样,这个程式框架是全功能的,可以通过编译并运行,你可以看到一个有选单的视窗 。唯一可以进行的操作是“File”选单的“Exit”项,你可以使用这个选单项关闭这个简单的视窗,也可以使用[Ctrl]+[Q]完成同样的操作 。现在你可以看一下这个程式的原始码,你会注意到这个程式比那个“Hello World!”程式複杂了许多,我可以告诉你一个小窍门——从原始码的结尾开始读起,因为通常那里才是一些功能函式的所在 。使用WeditRes创建资源在Windows程式的开发中,资源是十分重要的部分,选单、对话框和其它的一些用户接口部分都是可以象写程式一样的编写的,可以简单的作为资源包含进程式中 。如果Lcc-Win32没有提供一个资源编辑器那幺Lcc-Win32将不是一个完整的Win32编译程式,Lcc-Win32提供的资源编辑器叫做WeditRes,是在“lcc\bin\”路径下 。的确,WeditRes还是在不断的完善的过程中,也就是说还没有开发完成 。不过它已经可以编辑一些手工编辑难以完成的资源了,比如:选单和对话框等等 。在IDE下调用WeditRes,在“Compiler”选单下选择“Resources”项 。如果你正在开发的程式是用嚮导生成的,那幺嚮导会产生一个资源档案,在这个文件里至少包括选单资源,WeditRes会打开这个资源档案,但是它不会找到相应的头档案,你应该为它指明头档案的路径 。通常是在WeditRes当前工作路径的上一级目录 。WeditRes要找的档案通常叫做prjnamewiz.h,这里的prjname是你指定的工程的名称 。经过这一步就可以修改工程所用的资源了 。如果你的程式不是由嚮导生成的,那幺WeditRes会提示你输入资源档案的档案名称,输入一个名称后点击“OK”,这时WeditRes会说不能打开这个资源档案,没有关係,这是因为这个目录下的确是没有资源档案的,还是在这个对话框中点击“OK”,然后在“File”选单中选择“New”项,这样就会为你的工程创建一个新的资源工程,键入一个工程名,一般情况是和应用程式的工程名相同,然后点击“Validate”,现在你需要手工在应用程式工程列表里添加这个资源档案(一般以“RES”为扩展名) 。在这里试举一例——我们来为我们上面创建的程式创建一个“关于”对话框资源 。运行WeditRes,输入头档案的路径后选择“Objects”选单的“New dialog”项,这时WeditRes会显示一个对话框,标题栏为“Dialog box parameters”,改变对话框的标题为“About this application”或者随便其它的什幺东西,然后在“Identity”(标识符)项键入一个你喜欢的东西,比如:“DLG_ABOUT”,在“standard buttons” 选单中选择“Validate”选项并点击“OK”关闭对话框 。你在这个时候应该可以看到一个新的对话框和一个浮动的工具条,在对话框中也应该有一个按纽,你可以用滑鼠拖动它来重新指定它的位置,如果你还想改变按纽上显示的文字——双击它打开属性对话框,或者先选定它,然后在浮动工具条下改变显示文字 。下面我们添加一个静态文本标籤,在工具条上选择文本工具,游标形状变成由一个矩形包围的指针,在对话框的窗体上点击一下,一个包含文本——“Text”——的矩形会出现在你点击的地方,可以通过滑鼠拖动来改变这个文本框的大小,同样也可以改变显示的文本和文本框的位置 。我们还可以在这个对话框中添加其它的装置 。空心方框、实心方框和组件盒等可以对这个对话框进行一些简单的装饰 。如果你想要删除一个装置,选定它然后按[Ctrl] + [X],或者选择“Edit”选单的“Cut”项 。还可以选择“Options”选单的“Test”项测试这个对话框的外观 。在工具列里有一个按纽的功能是相同的,就是看起来象一个开关的那个,如果想要继续编辑这个对话框,只要再次选择上述选项一次即可 。编辑完成后在“File”选单中选择存档,然后关闭WeditRes,为了显示这个对话框下面我们必须在程式中包含相应的代码 。寻找“OnCommand”语句,在那里肯定有一个switch语句的条件之一是选单命令“Exit”的(IDM_EXIT),现在我们为我们的新对话框添加一个新的case条件,输入如下代码:case IDM_ABOUT:DialogBox (hInst, MAKEINTRESOURCE(DGL_ABOUT), hwnd, AboutDlgProc);break;我们还需要编写对话框函式 。BOOL CALLBACK AboutDlgProc (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){switch (msg){case WM_COMMAND:if (LOWORD(wParam) == IDOK){EndDialog(hwnd,0);return TRUE;}break;}return FALSE;}你应该已经明白了,由嚮导来生成代码要简单得多!现在编译、连结这个程式,然后运行它,选择“Compiler”中的“Execute prj.exe”项,我们创建的对话框将显示在萤幕上了 。添加其它类型的资源你还需要知道如何添加其它资源,如图示等 。事实上WeditRes还不能编辑图示档案,作者说正在做这方面的工作 。所以你可能要 使用其它的工具来完成图示编辑的工作 。在资源创建完后,你要把它添加到工程的资源描述档案里面去 。如果你是使用嚮导创建的工程 。你只须要打开与工程名相同的*.RC档案就可以了 。如果你没有使用嚮导,那幺你只能新创建一个RC档案 。如果你是使用WeditRes创建的资源,在建立资源描述档案时有些事情是你必须知道的——必须包含WeditRes资源,甚至于你并没有使用任何由WeditRes创建的资源,你完全有可能在后续的工作中用到,我建议无论什幺情况都应该象下面这样做 。WeditRes一般要建立三个档案:一个*.DLG档案、一个*.H头档案和一个*.RES二进制资源档案 。DLG档案描述了由WeditRes创建的资源的定义(如:资源串、选单和对话框等),H档案是所有资源的符号名的定义,RES档案是编译后的二进制资源档案,这个档案将被连结到工程最后生成的可执行程式中 。资源描述档案(*.RC)的档案名称一定要和RES档案的档案名称相同,当Lcc-Win32的资源编译器(lrc.exe)编译资源时将覆盖原来的RES档案 。你可以在Wedit中创建资源描述档案,如下:#include <windows.h>#include "resources.h"#include "resources.dlg"息 。第二行包含由WeditRes产生的资源的符号名的头档案,我在这里假定你的资源工程名为“resurces”,可以改为你所定义的名称 。第三行是WeditRes产生的资源描述档案,这样不会丢失你已经创建了的资源 。下面你可以向资源描述档案中增加资源,下面是一个例子:IDI_MYICON ICON myiconfile.ico这一行定义了图示资源,在使用前,一定要定义图示的符号名 。比如在“prjwiz.h”档案(或者“resource.h”,如果你没有使用嚮导)中,如果你没有定义这个符号名,那幺编译器将认为它是一个字元串名 。添加游标或者点阵图资源的步骤是相同的,只要把关键字改为“BITMAP”或者“CURSOR” 。下面要做的是把资源描述档案包含在工程档案列表中,当下一次你编译工程,资源编译器也将编译这个资源描述档案,并把产生的二进制资源连结到执行档案内 。这样你可以添加图示、游标和点阵图资源,对于其它类型的资源可以使用RCDATA资源方式添加到资源档案内,就是一系列的由逗号分隔的数值信息,这种方式可以使Lcc-Win32的资源编译器不支持的资源得以添加到资源档案中去,比如WAV档案等 。使用非规格资源Lcc-win32的资源编译器可以使用各种类型的资源,如对话框、选单、图示等,但是它不能使用其它非规格的资源如多媒体档案(WAV,MID等等) 。你可能认为使用其它的资源编译器如微软在Win32 SDK中提供的资源编译器,或者其它的什幺东西 。但是这里的麻烦事是LCCLINK,因为它并不认识这些资源,因此也不可能把这些资源连结到你的执行档案中去,这和真是个大问题,你可能不得不使用其它的连结器,这意味着可能需要其它类性的入口库 。我认为这样做不是一个好的解决方案,主要的原因是Wedit不是设计成可以使用其它的连结器的,你将不得不在命令行下编译你的程式,放弃了Lcc-Win32 IDE提供的全部优点 。但是这里还是有一个可供选择的方案,——幸运的是LRC支持RCDATA资源类型,这种资源类型用来包含二进制数据类型的资源,使用一系列的数字列表表示 。下面是具体的实现方法:首先你需要转换你要使用的二进制档案到有一系列的有逗号分割数值表示的文本文件,LRC预设的认为这些数据是16位长的,它同时也支持32位长度的整数,只要在数值后添加“L”字元就可以了 。你可以从这里下栽做这些工作的转换器:* Bin2Txt: 开发者:Josef Planeta. 十分的灵活方便;* TextIt: 本文作者开发,可以一次转换多个档案 。这两个工具都带有源码,使用Lcc-Win32开发 。然后一定要在资源数据中包含这些整数列表,如果你的资源档案没有使用资源描述档案,如果你没有使用嚮导生成工程,这是有很大可能的 。你一定要建立一个资源描述档案,一般是这个样子的:#include <windows.h> //basic Windows header file#include "resources.h" //resource identifiers (generated by WeditRes)#include "resources.dlg" //resource scripts (generated by WeditRes)MySound RCDATABEGIN#include "mysound.txt"END在这个例子中,我们包含了一个叫做“mysound.txt”的档案,这个档案是由一个WAV档案转换成的数据档案 。要注意当前版本的LRC(V981126)在RCDATA资源的大小上是有限制的,如果任何一个数据档案大于70Kb,你有可能得到一个溢出信息(Overflow in resource data),在未来的版本中可能会有所改进,但是在目前如果出现了这种情况可能只有使用其它的资源编译器了 。使用RCDATA类型定义资源意味着你不能直接的指定PlaySound来播放这些资源,因为类型是不同的 。解决办法是手工把这些数据读入记忆体,下面的代码说明了在PlaySound时要做的事情:BOOL PlayRcSound (HINSTANCE hInst, LPCTSTR lpszSndName){HRSRC hr;HGLOBAL hg;LPVOID lpSndData;hr = FindResource (hInst, lpszSndName, RT_RCDATA);if (hr != NULL){hg = LoadResource (hInst, hr);if (hg != NULL){lpSndData = http://www.mancos-co.com/LockResource (hg);if (lpSndData != NULL){return PlaySound((LPCTSTR)lpSndData, NULL, SND_MEMORY);/* We do not need to unlock or unload the resource, *//* Windows will take care of this */}}}return FALSE;}如果你的资源在头档案中定义有标识符,叫做:ID_MYSOUND,那幺调用函式的方式应该是:PlayRcSound (hInst, MAKEINTRESOURCE(ID_MYSOUND));另外,如果你给出了一个字元串名,比如:MySound,函式调用如下所示:PlayRcSound (hInst, "MySound");静态库和动态库也许程式设计师就是喜欢比喻以类的修辞的,库的概念就是一个例子,它是用来存储可能在许多的程式中使用的代码,或者一部分十分专业的代码,只要写一次就可以了,甚至是由其他的人为你写的代码,这样使用这些代码而完全不用关心具体的实现细节 。和其它的Windows编译器一样,LCC-Win32也支持两种库——动态库和静态库 。静态库包含的代码在编译连结时将被添加在执行档中,它被称为“静态”库是因为一旦它连结到执行档中,就将不可改变(除非重新编译整个程式) 。而动态程式库不会由编译器连结到执行档中,而是在运行时由作业系统连结的,这样即使你改变了这个库,也不会使整个可执行程式重新编译 。静态库的编写要简单些,只要创建一个类型为“Static library (lib)”的新工程,添加你要在这个静态库中使用的原始资料——函式、数据等等,编译后就会得到一个LIB档案,这个档案里面包括了所有你指定的函式和数据 。如果你要使用这些函式或者 数据,在“Configuration”对话框中的“Linker”表里的“Additional libraries”项中指定静态库名称,通知编译器把这个静态库连结到工程里去,但是千万不要忘了把你的静态库放到连结器能够找到的地方,比如:“/lcc/lib”路径下 。动态程式库就有些麻烦了,你要使用两个档案而不是一个档案:动态库本身——DLL档案和关联入口库——LIB档案 。入口库是给连结器使用的,简单的说它使用来哄骗连结器的,同时它也包含了使Windows正确的调用相应动态库中的函式的信息 。而且,动态库的功能可以更加的强大,它有一个LibMain()函式,在程式每一次调用它时都要通过它来进行初始化的工作 。要创建一个动态程式库,你要创建一个DLL工程,然后你可以使用嚮导生成LibMain()函式 。添加你要使用的函式和数据,在编译这个工程后,你就可以得到DLL库和接口库档案 。如果要使用动态程式库,象使用静态库一样,要将接口库放在“/lcc/lib”路径下,在“Options”对话框中添加这个接口库 。同时也要把DLL档案放置在Windows能够搜寻到的路径下,Windows搜寻动态程式库的预设目录是“/windows/system/”和应用程式的起始目录,将动态程式库放置在这两个目录下都是可以的