又遇Release编译的一坑 -- 应用程序正常初始化(0xc000007b)失败。请单击“确定”,终止应用程序。...

       项目中使用了xlslib库,以动态库形式编译,由于它没有生成链接库lib文件,所以官方提供的demo中有createDLL这个小程序用来生成lib文件。然而我又 no zuo no die了一次。
        为了使生成程序文件夹只包含exe和dll以及其他必要文件,我修改了项目配置 434089-20161010105516008-1633891032.png
434089-20161010105516883-1703696715.png
 然后发现生成的dll文件在两个文件夹中居然不是一样的大小,具体vs做了些什么
434089-20161010105517321-1860451601.png
434089-20161010105517696-643785166.png
         当然,这是事后发现的,编译都没有问题,而Release下运行正常,Debug一运行就出现
  434089-20161010105518024-1529834342.png
 比对各种配置,依然没有发现问题。。。然后想到用 depends 查看一下不同版本二进制文件动态库依赖有没有问题。
Release:
434089-20161010105518493-661280424.png
 Debug
434089-20161010105519008-833600917.png
 发现Release版居然没有链接xlslib_dll.dll这个动态库,而源代码中
 
   
  1. CDataManager *CDataManager::Instance() {
  2. static CDataManager *instance = NULL;
  3. if (!instance) {
  4. //StandardTest("adfesa");
  5. instance = new CDataManager();
  6. }
  7. return instance;
  8. }
调用xlslib_dll.dll进行测试的地方(StandardTest)是被注释掉的,所以我怀疑是Release版编译器检查到动态库中的函数没有被使用过所以直接不链接该动态库,而Debug版中没有进行此项优化。于是将代码注释去掉,果然,这次Release版运行也出现如上错误。
发现这个情况后才开始看xlslib_dll的问题,然后发现两个文件夹中该文件的大小是不一样的。然后将intermediate目录中的该文件覆盖到bin目录中,居然能正常运行。。。而且depends查看也链接正常 434089-20161010105519868-1742024838.png
 所以,有时候 VS 给出警告提示
 
   
  1. 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这个错误的原因应该是需要链接的动态库存在,但是与程序需要的不一致导致的。




转载于:https://www.cnblogs.com/mforestlaw/p/5944954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值