在我的Visual Studio 2008项目中,活动配置为Release,并且在编译器和链接器设置中未启用调试符号 . 我正在从命令提示符构建一个exe文件:
devenv standalone_cpp.sln /build "RELEASE|WIN32"
没有理由在运行时使用调试DLL MSVCR90d.dll,但它会崩溃 . 我没有丝毫的线索,为什么只有调试dll被拾取而不是释放DLL MSVCR90.dll . 有人可以帮忙吗?
我甚至尝试在调试模式下构建我的.exe,希望它不会崩溃,但它仍然会崩溃同样的断言失败_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse) . 在我开枪之前请帮忙 .
2 回答
Re-install the MSVS2008 Service Pack 1. 您的安装似乎已损坏 .
我已经发生了这种情况 - 它表现出像这样的神秘行为,虽然我也看到它在链接大型DLL / EXE时出现奇怪的“内部错误”,有时编译非常大的项目或非常大的翻译单元 . 出于某种原因,重新安装该Service Pack有效 .
这是一个快速链接:http://www.microsoft.com/downloads/en/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E&displaylang=en
另一个想法可能是您将调试链接到您的发布可执行文件 . 即使您为“
RELEASE|WIN32
”构建了解决方案,如果任何先决条件(链接库)是调试版本(直接引用*.lib
,或者您引用了调试路径而不是发布路径),您最终会得到mix和该DLL的"debug"版本将尝试加载 .然后,它崩溃的原因可能是您在“发布”模块中分配并在“调试”模块中删除(反之亦然) . 这是行不通的,因为分配器是不同的(因为“调试”版本为标记和其他“调试检查”分配额外状态) .
请记住,即使您从命令行构建,MSVS2008也将"override"与
Tools==>Options
中的项目/解决方案设置进行任何设置/解决方案设置 . 检查是否没有为发布目标中的链接设置调试路径 . (这是微软做出的错误决定,因为它导致项目/解决方案文件没有描述实际发生的情况,他们在MSVS2010中删除了"feature" . )你可能也看看:
Linking against library in release and .exe in debug crashes in Visual studio
C++ Linking release built library with my debug build
我认为@Charley是有钱的 .
下载Dependency Walker并查看实际导致调试DLL加载的原因 . 如果你在问题中说的是正确的,那么它可能是你的exe依赖的另一个库 .