4

VS 2005 でコンパイルされた静的ライブラリ (.lib) を VS 2008 でコンパイルされたプログラムにリンクすることは正しいですか? ライブラリと私のプログラムは両方とも C++ で書かれています。このプログラムは、Windows Mobile 6 Professional エミュレーターで実行されます。

これは機能しているようで、リンクエラーはありません。ただし、リンクされたライブラリ内で奇妙なことが起こるため、プログラムは起動時にクラッシュします。たとえば lib は、大きな負の数のサイズを持つ文字のベクトルを返すことができます。

プログラムが VS 2005 でコンパイルされている場合、このような問題はありません。

さらに奇妙なのは、ビルドにリリース構成を使用する場合にのみ問題が発生することです。デバッグ構成を使用してコンパイルすると、問題は発生しません。

4

3 に答える 3

12

VS2005 と VS2008 は異なる STL 実装を使用します。VS2005 コードがベクトルを返す場合、オブジェクトのメモリ レイアウトは VS2008 が期待するものとは異なります。これが、返された日付に表示される壊れた値の理由です。

経験則として、プロジェクトのすべての C++ モジュールを常に同じコンパイラでコンパイルし、すべての設定/#defines を等しくする必要があります。

同様の動作を引き起こす特定の #define の 1 つは、VS2008 の SECURE_SCL #define です。#defining SECURE_SCL により、さまざまな C++ ライブラリ クラスにより多くのメンバー変数が導入されるため、異なる設定でコンパイルされた 2 つのモジュールはまさに問題を引き起こします。

于 2008-09-08T10:24:23.363 に答える
2

あなたが説明した方法で古いライブラリにリンクすることは間違いではありませんが、奇妙な動作が見られることは驚くことではありません。カップルの健全性チェック:

  • 両方のファイルが同じランタイム ライブラリの同じバージョンを使用していますか?
  • .EXE アプリケーションは、.LIB がビルドされたのと同じヘッダー ファイルを "認識" していますか? _WIN32_WINNT (など) マクロが適切に宣言されていることを確認してください。

また、.LIB と言うときは、真のスタティック ライブラリ (mylib.lib) を意味するのでしょうか、それとも DLL のインポート ライブラリ (mylib.lib -> mylib.dll) を意味するのでしょうか?

また、VS2008 実行可能プロジェクトのコンパイル/リンク設定は何ですか?

于 2008-09-08T09:52:32.707 に答える