c ++ DLL \ static library name问题

时间:2012-10-09 19:56:57

标签: c++ dll static-libraries

我有一个问题,我完全被目瞪口呆,跳跃的人可以指出我正确的方向。

我有一个链接有静态库的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获取参数也可以解决问题。

2 个答案:

答案 0 :(得分:1)

这很可能是使用不同版本的stl的问题。使用运行时c ++库时,在客户端和链接库中使用具有相同选项的相同编译器至关重要。是否可能使用客户端的发布版本或签名版本来调用库的调试版本

答案 1 :(得分:0)

DLL和静态库必须在相同的条件下编译,即内存对齐(字节,字,长),调用conentions(这可能在此处得到满足)和相同的类型延长(例如int可能在一个编译器/交换机上占用4个字节,在另一个上占用2个字节。