我有一个问题,我完全被目瞪口呆,跳跃的人可以指出我正确的方向。
我有一个链接有静态库的DLL。在DLL中我有一个带有以下签名并开始的函数:
CellMatrix BasisSwapFlows(double spread, const std::string & convention, int startDate, int endDate, bool forceEOM, const CellMatrix & returnSide, bool explode)
CashFlow::Vector flows(basisSwapFlows(spread, getBasisSwapConvention(convention), XLDate(startDate), XLDate(endDate), forceEOM));
....
在那里,我从静态库中调用一个带有签名的函数:
CashFlow::Vector basisSwapFlows(double spread, const BasisSwapConvention & convention, const XLDate & startDate, const XLDate & endDate, bool forceEOM)
当我在发布模式下编译并运行它时,然后在调用静态lib期间,第一个参数(spread)似乎未被激活。但是,在呼叫站点(在DLL中)显然是这样。在调试模式下不会发生这种情况。另外,如果在调用静态库之前,我会复制一个参数,即:。
double spread_loc(spread);
CashFlow::Vector flows(basisSwapFlows(spread_loc, getBasisSwapConvention(convention), XLDate(startDate), XLDate(endDate), forceEOM));
....
并通过它,问题不会发生。最后,如果我将静态lib函数的名称修改为basisSwapFlows_v2,那么问题就会消失。但是,重新排序参数不起作用。
我正在使用VS2010 C ++编译器。如果我能提供任何其他信息,请告诉我。
编辑:我还发现当我在两个库中的发布版本中关闭优化时,这个问题就消失了。实际上,只是在DLL中禁用优化会使问题消失。
编辑2:还发现只关闭整个程序优化但保留每个完全优化项目可以解决问题。
编辑3:保持所有优化,但通过const ref获取参数也可以解决问题。
答案 0 :(得分:1)
这很可能是使用不同版本的stl的问题。使用运行时c ++库时,在客户端和链接库中使用具有相同选项的相同编译器至关重要。是否可能使用客户端的发布版本或签名版本来调用库的调试版本
答案 1 :(得分:0)
DLL和静态库必须在相同的条件下编译,即内存对齐(字节,字,长),调用conentions(这可能在此处得到满足)和相同的类型延长(例如int
可能在一个编译器/交换机上占用4个字节,在另一个上占用2个字节。