我正在vs2008中编译一个c ++静态库,在解决方案中我还有一个使用lib的启动项目,并且工作正常。
但是当在另一个解决方案中使用lib时,我得到运行时检查失败。 “ESP的价值没有在功能调用中得到妥善保存” 单步执行代码我注意到函数foo()在崩溃之前跳转到bar()。有问题的函数只是常规函数而没有函数指针。
任何人都知道可能会发生什么,以及为什么它在使用同一解决方案中的lib时有效?
编辑:函数(方法)是类的一部分,如果有帮助的话。
答案 0 :(得分:15)
请原谅我在这里说出明显的流血,但是......在对象(.o)和标题(.h)文件不同步之前,我已经看过很多次这种事情。特别是关于虚拟方法。
考虑:目标文件使用标头编译:
class Foo { virtual void f(); };
然后标题变为:
class Foo { virtual void g(); virtual void f(); };
对于下一个目标文件,编译器关于f()在类的vtable中的位置的假设是不正确的。
通常只需重新编译世界(一切!)都会有所帮助。
答案 1 :(得分:7)
这很可能是由于不兼容的调用约定,其中库和调用者对堆栈布局有不同的想法。
请查看MSDN了解详情。
答案 2 :(得分:3)
确保您没有选择 在你的项目中的旧版本 图书馆,即。 (正如亚当提到的) 您选择了较旧的调试 版本而不是当前版本 版本或反之亦然。
您可能需要重建。
还要注意宏可能获得的条件编译 在某些时候#defined或#undef'd(另一个解决方案可能有一些 宏或预计的#defines)。一些 次删除可能会有所帮助 你的.lib .obj,并预编译 带有重建的标题缓存。
远程可能会在IDE中搞砸一些东西 或项目配置,你在哪里 可能需要重新创建你的项目 从头开始。
我对MS VC不太熟悉,可以添加库的项目吗? 来自其他解决方案的文件?对于 例如,在Borland C ++ Builder中你 可以定义项目组和 建立/制作多个项目,我 总是把项目放在 我在我的程序中使用的库 项目组,所以一切都得到 我建立时的最新版本。
答案 3 :(得分:2)
确保您在调试模式下编译,而不是在发布模式下编译。如果您尝试在发布模式下调试程序,由于优化,您从调试器返回的数据将是垃圾。
答案 4 :(得分:1)
我记得当二进制文件的struct member alignment(/ Zp编译器开关)不同时,会看到这样的事情。你也可以检查一下。
通过#pragma pack而不是通过项目设置进行设置应该更安全。