我在vs2008中编译一个c ++静态库,在解决方案中我也有一个使用lib的启动项目,并且工作正常.
但是当在另一个解决方案中使用lib时,我得到运行时检查失败."ESP的值没有在功能调用中正确保存"通过代码我注意到函数foo()在崩溃之前跳转到bar().有问题的函数只是常规函数而没有函数指针.
任何人都知道可能会发生什么,以及为什么它在使用同一解决方案中的lib时有效?
编辑:函数(方法)是类的一部分,如果有帮助的话.
请原谅我在这里说出明显的流血,但是......在对象(.o)和标题(.h)文件不同步之前,我已经看过很多次这种事情.特别是关于虚拟方法.
考虑:目标文件使用标头编译:
class Foo { virtual void f(); };
但随后标题变为:
class Foo { virtual void g(); virtual void f(); };
对于下一个目标文件,编译器关于f()在类的vtable中的位置的假设是不正确的.
通常只需重新编译世界(一切!)将有所帮助.
这很可能是由于不兼容的调用约定,其中库和调用者对堆栈布局有不同的想法.
有关详细信息,请查看MSDN.