watcom 编译器怎么使用呀?
谁能写一下watcom C操作指南,我在XP下运行,想编写纯DOS下程序,这个软件怎么操作呀,全是英文帮助,也看不懂呀,只要说一下,从进入界面一直到如何运行程序就行了,能了半天运行时总是一闪就过,我也写getch()了呀。在使用watcom C 是不是不用写什么语句就可以直接进入保护模式,直接申请大内存了?<BR><BR>watcom是在版主的网站上下的<P>到后来,Watcom C/C++作为一个开源自由项目出现在世人眼前,也就是我打算跟你介绍的Open Watcom(以下简称OW)。现在的OW可以生成Win32、OS/2、Linux、DOS等平台下的执行程序,编译速度和后端优化效果依然是那么夺目。好了,言归正传,首先下载一份OW的安装程序,你可以在本站的共享资源区里找到它,当前版本是1.6。下载之后,执行安装程序,首先得同意它的授权协议,然后决定安装路径,然后选择安装模式,初学者可以直接选Full installation,即完整安装。当然也可以选择Selective installation,进行有选择的安装。这里假设你选择的是Selective installation,"Next"之后出现一个定制对话框,第一项是问你是否需要16位的DOS编译器,点击后面的按钮会让你选择要用的编译模式,比如Small啊Large啊什么的,编译模式决定你的程序能使用的代码段及数据段的大小和寻址方式,这个概念在这里就不再详细介绍了,不明白的可以到网上去查查;第二行是32位编译器的选项,基于寄存器的调用方式和基于栈的调用方式,建议都勾上;第三行是目标操作系统,也就是你想让编译器能针对哪些平台生成执行文件,可选项有DOS、Windows 3.x、OS/2、Windows NT/9X/32s、Linux、Novell Netware,如果你要写DOS程序,勾上第一项,若还要写Windows程序勾第四项…… 接下来的主机系统,也就是你想在哪些平台上运行OW的编译器,有DOS、Windows 3.1、OS/2、Windows NT/9X,一般来说勾上最后那项就可以了;最后是工具和组件,有C++编译器组件、实例和运行时启动源代码,视个人情况选择吧。选择好了之后,可以开始安装了,没选全也没关系,安装好了之后再运行安装程序可以再增减安装项目。</P>
<P>接下来,让我们来建立第一个OW工程,从开始菜单中打开OW的“IDE”,选择“File”->“New Project”,在弹出的对话框里指定工程名和路径,点击“打开”按钮,在接下来的对话框中选择目标环境和最后生成文件的类型,目标环境就是你打算在什么系统下执行你写的程序,这里以DOS为例,你会看到DOS - 32-bit字样的单选框,当然如果你安装时选择了16位编译器的话,就应该还有DOS - 16-bit单选框,假设你选择的是DOS - 32-bit,在Image type下会出现很多选项,这是一些DOS下的扩展器,建议选择“DOS/4GW Executable”或“DOS32/A LE Executable”,点击“OK”,即创建了一个工程。</P>
<P>在工程文件面板上单击右键,在弹出菜单中选择“New Source”(或直接按键盘上的Insert键),跳出"Add files"对话框,此时可以往工程里添加源文件了,找到你要的源文件,点击“Add”将其添加到工程里,添加完毕之后点击“Close”关闭对话框,现在工程文件面板中会多出你刚才添加的那些文件,要修改其中的某个文件,可以双击该文件的文件名,你会发现此时该文件是被记事本打开的,因为OW没有自带代码编辑器,所以默认是用系统记事本打开的,你也可以换成你习惯的编辑器,比如DEV-CPP或Visual C/C++, 方法是选择“File”->“Set text editor”,再弹出的对话框中点击“Browse”,然后找到你要用的编辑器,就OK了。也许OW没有自己的文本编辑器算是个缺陷,但反过来想你可以使用自己觉得顺手习惯的文本编辑器,也不是什么坏事。在记事本或你指定的编辑器中修改好你的代码之后,保存,再切换到OW的IDE中来,选择“Target”->“Make”或直接按F4键,就可以编译你的程序了,编译过程中有任何错误会在下方的“IDE Log”框里显示,不过由于没有自带的文本编辑器,所以你双击某行错误信息并不会直接跳到出错的代码行,而仅仅是打开源文件,这个时候你得记下出错信息最前面小括号里的行号,然后到编辑器里转到相应的行,找出你的错误来。下面给出一个示例程序:<BR>/* A example for Open Watcom By DongKai */<BR>#include <stdio.h> /* 包含printf()的声明 */<BR>#include <stdlib.h> /* 包含system()的声明 */<BR>#include <conio.h> /* 包含getch()的声明 */</P>
<P>int main()<BR>{<BR> system("cls"); /* 这一句不是必须的,加上它是为了清除DOS/4GW加载时的一些信息 */<BR> printf("Hello world!\n");<BR> getch();<BR> return 0;<BR>}</P>
<P>在编译的时候有些你可能要注意的:源文件最后得专门留下一个空行,否则编译器会有一个警告,这和GCC很像;OW的库函数接口许多和Borland C/C++的很像,所以大部分的TC或BC库函数都能在OW下使用,而且OW提供了那些函数的强化版本,比如防止溢出版和宽字符版。如果你英文不错的话,OW自带的大量文档都是很好的资料,值得一看。</P>
<P>这一篇就到这儿了,我会抽时间接着写下一篇,感谢捧场。转载的请务必给明出处:0101部落 <a href="http://www.ds0101.com/" target="_blank" >http://www.ds0101.com/</A></P>
<P>董凯</P> 太感谢了,我回去好好看看 watcom 在硬件操作上和用汇编和一样吗? C该怎么操作硬件,有C的一套方法,比如用指针对内存访问,out/inport对端口访问,int386x对中断,asm内嵌汇编……<BR>该怎么操作就怎么操作。 <DIV class=quote><B>以下是引用<U>一笔苍穹</U>在2007-7-19 9:14:03的发言:</B><BR>C该怎么操作硬件,有C的一套方法,比如用指针对内存访问,out/inport对端口访问,int386x对中断,asm内嵌汇编……<BR>该怎么操作就怎么操作。</DIV>
<P>watcom是32位的,而tc是16位的呀,在变量定义的操作上,和硬件操作上应该是不同的吧?[em13][em13][em13]</P> STLport 是什么东西,在open watcom C++里如果STLport 呢? 大体上是差不多的,就说中断吧,TC上一个软中断可能是这样产生的int86(0x10, regin, regout),而OW上则是int386(),从这里可以看出,他们的接口很相似,象DJGPP则是_dmpi_int_(),感觉上差的比较远了.<BR>另外,OW不支持TC/BC那种伪寄存器变量,象_AX,你得使用寄存器结构(当然也可以自己封一套这样的接口出来)。<BR>不过DJGPP也有自己的独到之处,它内置的DPMI的支持很完整,而OW的DOS/4GW则只是DPMI 0.9的不完整支持(虽然现在最新的DOS/4GW出来了,但还没授权给OW作为免费的组件,要花钱买),这样就导致有些中断用OW不如DJGPP方便,可能需要你自己通过DMPI中断的子功能写一些代码(因为DOS/4GW支持不够完全嘛)。这些东西得花时间去摸索,我也不清楚你具体需要那方面的技术支持,你可以边用OW边看它的文档,很详细,当然你如果要用DOS/4GW的话,最好也还去看看它的文档,了解它的工作机制。<BR>在这个过程中,遇到什么问题可以帖上来,我很愿意一起讨论。 支持下<BR>等以后有时间我也开始研究下WC。 watcom在XP下新建选dos-32->dos/4GW<BR>把程序写好了后,Targets->make 也没有错误,run可一闪就过了,写getch()了呀? <P>/* Svga64k.bgi 测试文件 */</P>
<P>#include "graphics.h"<BR>#include "Svga256.h"<BR>#include "stdio.h"<BR>#include "fcntl.h"<BR>#include "malloc.h"<BR>#include "io.h"</P>
<P>int huge Return_SVGA256(void)<BR>{<BR> return(SVGA320x200x256); /* 返回各种分辨率的对应编号 0~6 宏定义参见 Svga256.h */<BR>}</P>
<P>int main(void)<BR>{<BR> int width, height, i=DETECT, j=0, x0, y0, fp;<BR> unsigned char fix, *buffer, pix24b[4];<BR> DacPalette256 dac256;<BR> installuserdriver("Svga256", Return_SVGA256); /* 对于svga256必需执行该函数以安装BGI驱动 */<BR> initgraph(&i, &j, ""); /* 执行TC默认的BGI初始化函数 */</P>
<P> if((fp = open("xy_256.bmp", O_RDONLY | O_BINARY)) == -1)<BR> {<BR> puts("Can't find file ""xy_256.bmp"".");<BR> return 1;<BR> }<BR> lseek(fp, 18, SEEK_SET);<BR> read(fp, &width, 4);<BR> read(fp, &height, 4);<BR> fix = (width % 4) ? (4 - width % 4) : 0;<BR> x0 = (320 - width) / 2;<BR> y0 = (200 - height) / 2;<BR> lseek(fp, 54, SEEK_SET);<BR> for(i = 0; i < 256; i++) /* 按照该图片的DAC色表设置色彩寄存器 */<BR> {<BR> read(fp, pix24b, 4); /* 读取DAC分量信息 */<BR> /* 设置调色板 */<BR> dac256[i][0] = pix24b[2] >> 2;<BR> dac256[i][1] = pix24b[1] >> 2;<BR> dac256[i][2] = pix24b[0] >> 2;<BR> }<BR> setvgapalette256(&dac256); /* 应用调色板, 定义参见 Svga256.h */<BR> buffer = (unsigned char *)malloc(width);<BR> for(j = height - 1; j >= 0; j--)<BR> {<BR> read(fp, buffer, width);<BR> lseek(fp, fix, SEEK_CUR);<BR> for(i = 0; i < width; i++)<BR> putpixel(x0+i, y0+j, buffer[i]);<BR> }<BR> free(buffer);<BR> close(fp);<BR> getch();<BR> closegraph();<BR> return 0;<BR>}</P>
<P>----------------------------------------------------------------------------<BR>这是win-tc下一个第三方BGI的一个程序,在win-tc好使,但到了watcom就出现下面的错误了,一些头文件,我已经 拷入到C:\WATCOM\h中去了,svga256.bgi和程序文件也在同一个目录下,怎么会出现错误呢?</P>
<P><BR>cd C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1<BR>wmake -f "C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.mk" -h -e "C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.exe"<BR>wcc386 256_test.c -i=C:\WATCOM\h -w4 -e25 -zq -od -d2 -6r -bt=dos -mf<BR>C:\WATCOM\h\graphics.h(376): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\dos.h(251): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\stdarg.h(24): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\stdio.h(186): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\fcntl.h(52): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\malloc.h(58): Warning! W138: No newline at end of file<BR>C:\WATCOM\h\io.h(70): Warning! W138: No newline at end of file<BR>256_test.c(54): Warning! W131: No prototype found for function 'getch'<BR>wlink name NONAME d all SYS dos4g op m op maxe=25 op q op symf @NONAME.lk1<BR>Error! E2028: installuserdriver_ is an undefined reference<BR>Error! E2028: initgraph_ is an undefined reference<BR>Error! E2028: putpixel_ is an undefined reference<BR>Error! E2028: closegraph_ is an undefined reference<BR>file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol installuserdriver_<BR>file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol initgraph_<BR>file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol putpixel_<BR>file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol closegraph_<BR>Error(E42): Last command making (C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.exe) returned a bad status<BR>Error(E02): Make execution terminated<BR>Execution complete</P> <P>WC提供的函数库除了提供标准C\c++库的函数外还拥有<BR>Heap Functions / Process Primitive Functions / Process Environment / Operating System I/O Functions /Console I/O Functions / Default Windowing Functions / BIOS Functions /DOS-Specific Functions / Intel 80x86 Architecture-Specific Functions / Intel Pentium Multimedia Extension Functions等其他函数<BR>WC的支持库包括:<BR>图形库 : SciTech's MGL; wxWindows;WGT Watcom C/C++ ;Xlib Watcom C/C++; Watcom C/C++ ModeX;PD Curses; IFF Software;JLIB ;Zephyr's ZSVGA ;gkit ;StelSOFT GDK ;Allegro D-Flat;OWL NExt ;Turbo Vision+ ;libpng ; <BR>音频库 : VAT Watcom C/C++ ;SMIX Watcom C/C++ ;DSIK Watcom C/C++ <BR>及其他工具库dllPower ;STLPort ;XBase ;zlib 等等。</P>
<P>这些函数在那能下载,怎么使用呀?特别是图形库</P> 那段程序肯定不行的,光是#include "graphics.h"在OW下就没有,到哪个山头唱哪支喝,TC有些私有的并非放之四海皆可的。<BR>那些函数OW自带的,那些图形库可以到google上找,也可以关注<BR>http://www.ds0101.com<BR>现在已经有一些了,我会陆续更新这方面的东东进去。 你说的“OW的文档”是指它的IDE文档吗? 不单是IDE的文档,OW 1.6会在开始菜单里建立一个子菜单,里面应该有近十个帮助文件,涉及到C库函数、C++类库、IDE使用、调试方法、用户手册等等等等。可谓很全面了,只不过都是E文的。 cd C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1
wmake -f "C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.mk" -h -e "C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.exe"
wcc386 256_test.c -i=C:\WATCOM\h -w4 -e25 -zq -od -d2 -6r -bt=dos -mf
C:\WATCOM\h\graphics.h(376): Warning! W138: No newline at end of file
C:\WATCOM\h\dos.h(251): Warning! W138: No newline at end of file
C:\WATCOM\h\stdarg.h(24): Warning! W138: No newline at end of file
C:\WATCOM\h\stdio.h(186): Warning! W138: No newline at end of file
C:\WATCOM\h\fcntl.h(52): Warning! W138: No newline at end of file
C:\WATCOM\h\malloc.h(58): Warning! W138: No newline at end of file
C:\WATCOM\h\io.h(70): Warning! W138: No newline at end of file
256_test.c(54): Warning! W131: No prototype found for function 'getch'
wlink name NONAME d all SYS dos4g op m op maxe=25 op q op symf @NONAME.lk1
Error! E2028: installuserdriver_ is an undefined reference
Error! E2028: initgraph_ is an undefined reference<BR>Error! E2028: putpixel_ is an undefined reference
Error! E2028: closegraph_ is an undefined reference<BR>file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol installuserdriver_
file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol initgraph_
file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol putpixel_
file 256_test.obj(C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\256_test.c): undefined symbol closegraph_
Error(E42): Last command making (C:\PROGRA~1\WIN-TC\PROJECTS\第三方~1\NONAME.exe) returned a bad status
Error(E02): Make execution terminated<BR>Execution complete
这些错误是因为环境变量没有正确配置导致的吗 ?
页:
[1]
