C++ 对象中的编译器指纹

C++ 对象中的编译器指纹,c++,visual-studio,visual-c++,visual-studio-2013,visual-studio-2015,C++,Visual Studio,Visual C++,Visual Studio 2013,Visual Studio 2015,我只是花了一天的大部分时间试图弄清楚我为什么会出错: 表达式:块类型是否有效(头->块使用) 事实证明,我的一个第三方软件包(Apache Log4CXX)是用Visual Studio 2013(VC120)编译的,我的应用程序是用Visual Studio 2015编译的。该生成意外地从错误的库中提取DLL debug_堆在这两者之间使用不同的内存头格式(因此无效的_block_用法),当您试图释放内存时,会发生不好的事情 关于这个问题,我知道Java已经将编译器的版本号编译到了它的类文件中

我只是花了一天的大部分时间试图弄清楚我为什么会出错:

表达式:块类型是否有效(头->块使用)

事实证明,我的一个第三方软件包(Apache Log4CXX)是用Visual Studio 2013(VC120)编译的,我的应用程序是用Visual Studio 2015编译的。该生成意外地从错误的库中提取DLL

debug_堆在这两者之间使用不同的内存头格式(因此无效的_block_用法),当您试图释放内存时,会发生不好的事情

关于这个问题,我知道Java已经将编译器的版本号编译到了它的类文件中(YahJava)。VisualStudio是否用某种类型的指纹标记对象、LIB或DLL文件,识别了Visual C++编译文件的版本?


我尝试用dumpbin和objdump转储头文件,但没有什么能作为编译器指纹突出。

第三方组件也是用调试设置(调试分配器)构建的?是的。这个问题肯定是由于编译器不匹配造成的,我用反汇编程序运行了代码,直到在标题中找到了问题。我知道混合调试和发布代码时会出现问题,这是我检查的第一件事。您是否在一个模块上分配内存,并在另一个模块中释放/重新分配内存?即使使用相同版本的编译器,它应该如何工作?@VladFeinstein如果所有模块都使用相同版本和风格的CRT DLL(而不是静态链接到CRT),它也会工作。然后,它们都共享同一个堆管理器。对,问题在于能否验证我是否拥有正确的DLLsThird party组件也是使用调试设置(调试分配器)构建的?是的。这个问题肯定是由于编译器不匹配造成的,我用反汇编程序运行了代码,直到在标题中找到了问题。我知道混合调试和发布代码时会出现问题,这是我检查的第一件事。您是否在一个模块上分配内存,并在另一个模块中释放/重新分配内存?即使使用相同版本的编译器,它应该如何工作?@VladFeinstein如果所有模块都使用相同版本和风格的CRT DLL(而不是静态链接到CRT),它也会工作。然后,它们都共享同一个堆管理器。对,问题在于能否验证我是否拥有正确的DLL