《3D游戏编程大师技巧》是在VC++环境下写的,现在在VS.net学习代码,最新碰到的就是重新编译不断报错的问题。
最然按照作者的编译器设置章节进行了设置,可还是无法一次编译成功。
在此作个笔记,记录下来备查吧
一、无法找到<iostream.h>文件。
原因:现在的头文件改为<iostream.hpp>了
解决:将<iostream.hpp>替换为<iostream.>即可
二、error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)
原因:网上找的答案,见
error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)[转]
总结为一句话:dx9SDK提供的头文件<basetsd.h>没有定义POINTER_64。
解决:我的解决办法就是把dx9SDK\include下的basetsd.h改名为basetsd_bk.h。目前很顺利
三、index未定义
原因:index定义在 for (int index=0; index<2; index++){*****}中,而出错的地方index都在该特环体之外。
就是说,现在的编译器对变量的作用域控制得更严格了
解决:把for(****)中的int index=0放到循环体之外,提升该变量的作用域范围。
四、错误 error LNK2019: 无法解析的外部符号 ,
原因:因为链接器未链接所需的链接库(*.lib)
解决:链接器属性设置的输入项中,在“附加依赖项”栏输入所用到的lib文件。或者在头文件中加入“#prgma comment(lib,”库文件.lib”)”
1)__imp__mmioRead@12,该符号在函数 “int __cdecl DSound_Load_WAV(char *,int)” (?DSound_Load_WAV@@YAHPADH@Z) 中被引用 d:\我的文档\visual studio 2010\Projects\d3_2\t3dlib3.obj d3_2
对应的lib文件是 winmm.lib
五、Load_Bitmap_File()中_lseek(……)报错。
跟踪代码,到read.c中,发现是 _VALIDATE_CLEAR_OSSERR_RETURN((fh >= 0 && (unsigned)fh < (unsigned)_nhandle), EBADF, -1);抛出的异常。
fh是传入的句柄,与Load_Bitmap_File()中打开时生成的文件句柄的值(3XXX)一致,没问题
而_nhandle的值为32,所是(unsigned)fh < (unsigned)_nhandle),为否所引发的异常。可是_nhandle是什么,如何作用?找到不资料,也就无从下手改正了。
大的原因应是文件的IO操作引起。为了找到文件操作到底有何错。写了个控制台程序,运行到_lseek(),很正常汉有问题。
#include "stdafx.h"
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
int _tmain(int argc, _TCHAR* argv[])
{
int file_handle;
long fileSize;
BITMAP_FILE_PTR bitmap = new BITMAP_FILE();
if((file_handle = open("greengrid.bmp",O_RDONLY)) ==-1)
{
printf("Error");
return 0;
}
fileSize = filelength(file_handle);
printf("The file size in bytes is %ld\n",fileSize);
fileSize = _lread(file_handle,&(bitmap->bitmapfileheader),sizeof(BITMAPFILEHEADER));
printf("The bitmapFILEheader size in bytes is %ld\n",fileSize);
_lread(file_handle, &(bitmap->bitmapinfoheader),sizeof(BITMAPINFOHEADER));
printf("The bitmapINFOheader size in bytes is %ld\n",fileSize);
fileSize = _lread(file_handle, &bitmap->palette,256*sizeof(PALETTEENTRY));
printf("The bitmapINFOheader size in bytes is %ld\n",fileSize);
_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
close(file_handle);
getchar();
return 0;
}
经对比原代码,发现Load_Bitmap_File()中是用WindowsAPI函数OpenFile()打开的文件,而我用的是C函数open(),
解决:于是果断用open()代替OpenFile(),此处过关。再次断点跟踪发现,open()后得到的file_handle的值尽然只有3,肯定小_nhandle啦。
参考网上搜到以下文章,
(原)错误修正:《Windows游戏编程大师技巧》demo7_10 – demo7_12…
Direct9+VS2005 读取bmp位图时,_lseek()函数断言报错分析
估计原因是这样:在古老的C环境或者是C库编写时的环境下,最多能同时打开文件有限,而_nhandle估计就是这个上限值
vc6.0时这个上限还没突破(又或是还没来得及改?)所以作者在vc6.0环境下,可以OpenFile()WinApi函数与C函数混用。
而VS.net环境下,这个值有了超常的提高(或许无限?没求证),并且微软的工程师重写了OpenFile(),分配一个超大的文件句柄,而这个句柄大超出了_nhandle的限定,所以当我们用VS重新编译前辈的代码时,就抛出了异常。
参考资料中用到_llseek()或许是微软工程师用来代替_lseek()以匹配更多的文件句柄的解决方案吧。
(估计后面还会跑到不少因库函数重写产的问题)