VC++2010 bug

软件复杂了,总会有或多或少的bug,今天就遇到一个,从表现来看是VC++ 2010的bug,因为这个确实很难测试覆盖。

http://social.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/cae52fba-6af8-4f93-bfae-209d44d4f134/

我这里有一个VC++2005的工程编译正常,之前曾升级到VC++2008也编译正常,今天升级到2010以后,编译失败,信息如下:

1>—— Build started: Project: Cal, Configuration: Debug Win32 ——

1>LINK : fatal error LNK1104: cannot open file ‘E:workCalDebugCal.lib’
1>
1>Build FAILED.

问题是Cal本身是一个dll工程,编译生成的应该是Cal.dll和Cal.lib,不可能link阶段依赖自己的lib。

检查升级后的工程配置没有发现问题。磁盘可用空间足够,也没有只读的Cal.lib或者写入不能的目录。

解决办法:

整个项目在转换到2010前有一些工程不存在(unloaded),因为我并没有在当前这台机器上完整check out。

在转换过程中看起来是VC2010错误的分析了依赖关系,把Cal依赖的别的工程错误的指向了Cal自己,变成了一个循环依赖。

这个问题我暂时用下面的方法解决了:

处理前,linker的命令行参数是: /OUT:".debugCal.dll" /INCREMENTAL /NOLOGO /DLL "opengl32.lib" "glew32.lib" "glu32.lib" "E:workCaldebugCal.lib" /DEF:".Cal.def" /MANIFEST /ManifestFile:".DebugCal.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level=’asInvoker’ uiAccess=’false’" /DEBUG /PDB:".debugCal.pdb" /MAP /MAPINFO:EXPORTS /SUBSYSTEM:WINDOWS /PGD:"E:workCaldebugCal.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT /NOASSEMBLY /MACHINE:X86 /ERRORREPORT:QUEUE

处理办法:打开工程属性,选择common properties,找到 link library dependencies,把 true 改成 false。

这样可以看到linker的命令行中的 "E:workCaldebugCal.lib" 被去掉了。

当然我不认为这个是真正的完美解决办法,有待微软修正。

Advertisements

About HyperIris

Wild Scientist
此条目发表在编程艺术分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s