完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错
我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决方案和一个懒人补丁包。问题描述如下:在重新编译的时候,经常报错:
fatal error LNK1201: 写入程序数据库“.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
原因是编译要生成.pdb文件,但是这个.pdb文件又被VS的进程独占,所以生成失败。这个现象由来已久,MSDN上有外国开发者指出这是VS的老毛病了,而且win7并不在vs2003的支持列表里,你找微软说理人家也不鸟你。网上有国人扯什么
当你编译某一项目时,该项目的pdb文件正被另一处于调试状态下的编译器所使用,编译无法向项目pdb文件写入数据,无奈之下,编译器只好向你报LNK1201错误请求你协助解决。
最后还扯什么检查自己的linker,重启VS什么的,全是瞎扯,有些程序员遇到问题总是习惯先从自己身上找毛病,我认为这是奴才德性。明明是微软自己不兼容的bug,干吗替人家背黑锅?
好了不扯远了,来看看解决方案吧,既然问题由pdb文件引起,那么就应该拿跟pdb有关的选项动刀。
第一个方案的中心思想是不生成pdb文件:
打开项目属性–>链接器–>调试,去掉调试信息,干掉PDB文件,以后不依赖PDB就好了。
但是这样你就等于阉割了VS的调试功能,果然是欲练此功必先自宫呀。
第二个方案的中心思想是在生成pdb文件之前,先释放别的进程对它的句柄。
32位版本解决方案:
使用外部工具释放pdb文件句柄,我是从这位网友处知道有人专门做了个freepdb(只适用于32位)工具的:
Windows 7 使用 VS.NET 2003 开发项目时经常会遇到类似如下错误:
TestServer fatal error LNK1201: 写入程序数据库“d:\Projects\GameServer\data\TestServer.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
在排除了空间、路径、权限等原因后仍然无法顺利生成项目,微软官方也没有提供相关的解决方案,Google 了好几天也找不到网友任何修复建议,今天偶然发现 MSDN 上一篇帖子 , 正是讨论这个问题,于是尝试按照上面的步骤进行操作,竟然真的可以!特分享给大家~
二、解压这两个压缩包,并把“freepdb.cmd”和“handle.exe”两个文件移至同一目录下(如 C:\LNK1201\);
三、用 VS.NET 2003 打开一个项目,在解决方案资源管理器中项目文件上点右键属性,展开“生成事件”,点击“预生成事件”,在右侧命令行中填入:<path>\freepdb $(ProjectName) ;
四、完成!运行一下看看吧。如果仍然有问题,先双击运行这两个文件试试,因为我是先运行后再配置项目属性的,所以不确定不运行会不会出错。
如果上述文件无法下载,请联系 xoyozo 索取!Have fun!
提示,Win7 64位没戏了,上面的Handle是32位的,没法在64位下面释放handle,可能跟CreateRemoteThread有关。
另外这位网友说得很对,我补充说一点,下载下来的两个文件最好放进安装目录\Microsoft Visual Studio .NET 2003\Vc7\bin里面(这个文件夹是link.exe的位置),以免找不到路径。但是每次新建工程之后都要手动修改工程属性也太烦了,我决定在其基础上,一并将VS的工程模板修改了。
改起来稍微有些麻烦,话说回来,做技术本来就很麻烦,不麻烦能体现出诸位的过人之处吗?
首先打开\Microsoft Visual Studio .NET 2003\Vc7\VCWizards\win32wiz\scripts\2052\default.js,这个文件控制着win32模板的生成与默认属性。
搜索proj.Object.Configurations,在这一行代码下添加我写的如下两行代码
1
2
var VCPreBuildEventTool = config.Tools("VCPreBuildEventTool");
VCPreBuildEventTool.CommandLine = "freepdb $(ProjectName)";
你一共会找到两处,一处是var config = proj.Object.Configurations("Debug");,一处是config = proj.Object.Configurations.Item("Release");,分别对应工程模板的debug和release两个编译选项,按惯例修改之前先备份。改完之后保存,新建一个工程,先编译一下。然后去工程属性里看看,默认的预生成时间就有freepdb $(ProjectName)了:
顺便打开生成窗口,发现预生成事件freepdb.bat已经顺利运行了:
------ 已启动生成: 项目: testFREEPDB, 配置: Debug Win32 ------
正在执行预生成事件...
正在编译...
stdafx.cpp
正在编译...
testFREEPDB.cpp
正在链接...
生成日志保存在“file://testFREEPDB\Debug\BuildLog.htm”中
testFREEPDB - 0 错误,0 警告
---------------------- 完成 ---------------------
生成: 1 已成功, 0 已失败, 0 已跳过
如果你的是生成窗口显示的是找不到文件,那么说明你的freepdb放错了位置。
同理对MFC模板,也是一样的道理,打开\Microsoft Visual Studio .NET 2003\Vc7\VCWizards\mfcappwiz\scripts\2052\default.js进行一样的修改,接下来什么dll呀lib之类的模板也是一样的道理。
64位解决方案(其实也可以用于32位):
由于handle.exe不支持64位系统,hankcs决定采用大名鼎鼎的unlocker来代替它。方法和32位版本的方法差不多,不同的是,先去http://www.emptyloop.com/unlocker/ 下载一个绿色版的unlocker(同时支持32&64,也就是说,我这个所谓的“64位解决方案”其实也适用于32位的,前面的32位方案是被那个网友蒙住了,早知道有unlocker这种神器就不用那劳什子的handler了)。解压到\Microsoft Visual Studio .NET 2003\Vc7\bin里,然后将预编译命令行设为
Unlocker.exe "$(TargetDir)$(ProjectName).pdb" /S
就万事大吉了,如果你喜欢折腾,可以继续修改模板default.js,原理同上。
接下来随便怎么编译,故意让程序卡死,都不会出现 fatal error LNK1201错误了。
是不是很神奇?
我知道如果不把懒人补丁包放在最后面,你一定不会看完的。
补丁解压到你的安装目录下,选择全部替换
解压密码:www.hankcs.com
转载请注明:码农场 » 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错
完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错的更多相关文章
- fatal error LNK1201:写入程序数据库“***.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
问题很简单,是因为你的程序正在运行,或者windbg工具在执行dump文件,文件被占用,所以无法写入:
- 写入目录 /tmp/OraInstall2015-05-20_03-35-53PM 时出错
做足准备工作之后进行安装oracle,运行runInstall的时候别的时候输出如下错误 写入目录 /tmp/OraInstall2015-05-20_03-35-53PM 时出错.请确保此目录是可写 ...
- excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法 office2007应该遇到“向程序发送命令时出现 问题”,设置为以管理员运行也不好用,重装office也不好用,下面介绍下 ...
- 【已解决】phpMyAdmin中导入mysql数据库文件时出错:您可能正在上传很大的文件,请参考文档来寻找解决办法
期间,用phpMyAdmin去导入90M左右的mysql数据库文件时出错: 您可能正在上传很大的文件,请参考文档来寻找解决方法. [解决过程] 1.很明显,是文件太大,无法导入.即上传文件大小有限制. ...
- 解决:[DCC Fatal Error] **.dpk : E2202 Required package '***' not found
//[DCC Fatal Error] **.dpk : E2202 Required package '***' not found 意思是:[DCC致命错误] *:e2202需包***没有发现 D ...
- 解决Ubuntu16.04 fatal error: json/json.h: No such file or directory
参考博客 错误产生 安装json-c库之后,根据GitHub上面的readme文件链接到json-c库时出现以下错误: SDMBNJson.h:9:23: fatal error: json/json ...
- 解决 LLVM 错误 fatal error: ‘csignal’ file not found
/Users/exchen/Downloads/Unity-iPhone/Classes/main.mm:3:10: fatal error: ‘csignal’ file not found#inc ...
- 解决报错Fatal error in launcher
换电脑重装python,打算安装第三方库的时候出现错误: Fatal error in launcher 然而在网上搜到的大多数是解决 —— Fatal error in launcher: Unab ...
- Error serializing object:序列化对象时出错
序列化对象时出错 :Error serializing object. Error serializing object. Cause: java.io.NotSerializableExceptio ...
随机推荐
- ssh ip "WARING:REMOTE HOST IDENTIFICATION HAS CHANGED!"
[root@ok network-scripts]# ssh 192.168.1.10 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- 会员制实现C2B定制有机农产品,被中粮我买投资的良食网这样卖有机生鲜
前几天,中粮我买网战略投资了位于深圳的有机生鲜自营平台良食网,宣布双方将会在供应链上展开合作.然而良食网对大家来说还是比较陌生的,为此36氪专访了良食网的创始人唐忠. 良食网成立于2011年,是一家以 ...
- C/C++中extern关键字详解
转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解释:extern可以置于变量或者函数前,以标示变 ...
- 用VMware9 安装 mac 10.8和10.9搜集的资料
VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程 http://diybbs.zol.com.cn/1/34037_699.html vmware too ...
- arcgis android 通过getExtent得到当前地图范围四个点的坐标
困扰了我很久的问题终于要得到解决了,先欢喜一下.我的目的是想做一个当程序完全退出后,再次打开程序地图直接显示上次程序退出前地图的范围.arcgis for android官方软件就有这个功能.网上搜索 ...
- The Suspects 简单的并查集
Description 严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁.为了减少传播给别人的机会, 最好的策略是隔离可能的患者. 在Not ...
- html表单应用
<!DOCTYPE html> <html> <head> <meta name="generator" content="HT ...
- phonegap+html5开发app的一些总结
1.Css3圆角白边:使用css3圆角效果时,在android某些机器上会产生白边,所以应该在圆角的div外套一个div(背景色和外部相同),然后有圆角效果的div 内部使用自己的背景色 border ...
- HDU 4669 Mutiples on a circle(环状DP)
题目链接 这是最早看懂题意的一题,状态转移,挺好想..但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到. 先预处理的dp[0]的情况,就是以p[0]为结尾的情况.之后D就行了,例如样例 ...
- Java_BigDecimal类型比较大小
这个类是java里精确计算的类 1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); ...