0

私は完全に唖然としていて、誰かが私を正しい方向に向けることができることを望んでいるという問題があります.

スタティック ライブラリがリンクされている 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)

これをリリース モードでコンパイルして実行すると、静的ライブラリの呼び出し中に、最初のパラメーター (スプレッド) が初期化されていないように見えます。ただし、(DLL 内の) 呼び出しサイトでは、明らかにそうです。これは、デバッグ モードでは発生しません。また、静的ライブラリへの呼び出しの前に、引数のコピーを作成する場合:

double spread_loc(spread);
CashFlow::Vector flows(basisSwapFlows(spread_loc, getBasisSwapConvention(convention), XLDate(startDate), XLDate(endDate), forceEOM));
    ....

それを渡すと、問題は発生しません。最後に、静的ライブラリ関数の名前をbasisSwapFlows_v2に変更すると、問題は再び解消されます。ただし、パラメーターを並べ替えても何も起こりません。

VS2010 C++ コンパイラを使用しています。他に提供できる情報があれば教えてください。

編集:両方のライブラリのリリースビルドで最適化をオフにすると、この問題がなくなることも発見しました。実際、DLL で最適化を無効にするだけで、問題は解消されます。

編集 2: プログラム全体の最適化をオフにするだけで、完全な最適化の各プロジェクトを残すことで問題が解決することも発見しました。

編集 3: すべての最適化をオンのままにしますが、const ref によってパラメーターを取得すると、問題も修正されます。

4

2 に答える 2

1

これは、異なるバージョンの stl を使用した場合の問題である可能性があります。ランタイム C++ ライブラリを使用する場合、クライアントとリンクされたライブラリで同じオプションを持つ同じコンパイラを使用することが重要です。ライブラリのデバッグ バージョンをクライアントのリリース バージョンまたはビザの逆で呼び出している可能性はありますか

于 2012-10-09T20:01:16.060 に答える
0

DLL とスタティック ライブラリは、メモリ アラインメント (バイト、ワード、ロング)、呼び出し条件 (おそらくここで満たされている)、および同じ型の長さ (たとえばint、1 つのコンパイラで 4 バイトかかる場合があります) など、同じ条件でコンパイルする必要があります。スイッチと別の 2 バイト)。

于 2012-10-09T21:22:16.027 に答える