1

Visual Studio 2005でコンパイルしたプログラムで、Visual Studio 2008で構築されたサードパーティの.libとリンクできないのはなぜですか?ありがとう

4

2 に答える 2

2

更新:これは、元の質問であったDLLにのみ適用されます。静的ライブラリを使用すると、すべての希望が失われます。

私はいくつかの事実を要約しようとします:

  • ABI自体は互換性があるため、すべてのデータ型と関数シグネチャに同じ定義を使用するコードは問題ありませんが、
  • システム内部構造定義とシステムインクルードファイルは、以下を除いて変更されている可能性があります。
  • ABIの一部は、固定互換性または下位互換性があるように定義されています。

したがって、関数とメソッドを呼び出して、完全に(つまり、それらのメンバーを含む)定義されたデータ型を渡すのは安全です。

  • DLLに一致するヘッダーファイル内、または
  • IDLファイル内(これらは一度公開されると変更されないことを意図しているため)、または
  • 定義が修正されることが保証されている場合は、システムヘッダーを含む別のヘッダーファイル

ポインターメンバーの場合、ポインターが逆参照されない場合、ルールは緩和されます。

ここで注意が必要な部分は次のとおりです。

  • システムアロケータの内部データ構造は、不変のセットの一部ではありません。割り当てられたメモリへのポインタは、その直前の割り当て構造へのポインタでもあるため、間接参照なしのルールが適用されます。したがって:
    • CoTaskMemAlloc()/を除いて、渡されたメモリの割り当てを解除することは安全ではありませんCoTaskMemFree()
    • 仮想デストラクタは、オブジェクトがDLL内に作成された場合にのみ呼び出すことができます(コンストラクタがエクスポートされるかどうかではなく、ここでカウントされるのはnew-expressionです)。
    • 非仮想デストラクタは、オブジェクトがDLLの外部で作成された場合にのみ呼び出すことができます。
  • STLは不変のセットの一部ではないため、structSTLタイプを含むものは安全ではありません。
于 2012-01-04T09:33:11.907 に答える
0
于 2012-01-04T08:56:12.007 に答える