又遇Release编译的一坑 -- 应用程序正常初始化(0xc000007b)失败。请单击“确定”,终止应用程序。
项目中使用了xlslib库,以动态库形式编译,由于它没有生成链接库lib文件,所以官方提供的demo中有createDLL这个小程序用来生成lib文件。然而我又 no zuo no die了一次。
为了使生成程序文件夹只包含exe和dll以及其他必要文件,我修改了项目配置
然后发现生成的dll文件在两个文件夹中居然不是一样的大小,具体vs做了些什么
当然,这是事后发现的,编译都没有问题,而Release下运行正常,Debug一运行就出现
比对各种配置,依然没有发现问题。。。然后想到用 depends 查看一下不同版本二进制文件动态库依赖有没有问题。
Release:
Debug
发现Release版居然没有链接xlslib_dll.dll这个动态库,而源代码中
CDataManager *CDataManager::Instance() {
static CDataManager *instance = NULL;
if (!instance) {
//StandardTest("adfesa");
instance = new CDataManager();
}
return instance;
}
调用xlslib_dll.dll进行测试的地方(StandardTest)是被注释掉的,所以我怀疑是Release版编译器检查到动态库中的函数没有被使用过所以直接不链接该动态库,而Debug版中没有进行此项优化。于是将代码注释去掉,果然,这次Release版运行也出现如上错误。
发现这个情况后才开始看xlslib_dll的问题,然后发现两个文件夹中该文件的大小是不一样的。然后将intermediate目录中的该文件覆盖到bin目录中,居然能正常运行。。。而且depends查看也链接正常
所以,有时候 VS 给出警告提示
2>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): warning MSB8012: TargetPath(F:\Projects\RFIDRecorder\intermediate\xlslib_dll\xlslib_dll.dll) does not match the Linker's OutputFile property value (F:\Projects\RFIDRecorder\bin\xlslib_dll.dll). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).
不要完全忽视。。。。虽然还是不懂为什么不直接将OutDir中的文件拷贝到Output,找到问题就知道怎么解决了,还是把General中的OutDir和Linker中的设置一致吧,总结一句:FUCK,浪费好多时间,也算吃一堑了。0xc000007b这个错误的原因应该是需要链接的动态库存在,但是与程序需要的不一致导致的。