4

Visual Studio 2008 で Visual Studio 6 を使用してコンパイルされた C++ スタティック ライブラリ (.lib) を使用することはできますか?

4

6 に答える 6

5

それは本当に依存します。ライブラリは、メモリが直接の Win32 メソッド (CoTaskMemAlloc など) によって管理される 'extern "C"' 関数のみを公開するか、または呼び出し元が呼び出し先によって割り当てられたメモリを決して解放しないか、またはその逆ですか? VS 6 以降あまり変更されていない基本的なライブラリのみに依存していますか? もしそうなら、あなたは大丈夫なはずです。

2 つの基本的な注意事項があります。サードパーティ ライブラリで使用されるグローバル変数への変更、およびそれらのサードパーティ ライブラリで定義された構造体、クラスなどの構造への変更。たとえば、CRT メモリ アロケータは、おそらく 2 つのバージョン間でその非表示の割り当て管理構造を変更したため、ライブラリの 1 つのバージョンでメモリの一部を割り当て、別のバージョンでメモリを解放すると、クラッシュが発生する可能性があります。

別の例として、インターフェイスを介して C++ クラスを公開し、それらが MFC などの MS ランタイム ライブラリに依存している場合、VS 6 と VS 2008 の間でクラス レイアウトが変更されている可能性があります。つまり、クラスのメンバー/フィールドにアクセスすると、間違ったことをして、予測できない結果を引き起こします。.lib が何らかの形で MFC を使用している場合、おそらく困惑しています。MFC は大量のグローバルを定義し、内部で使用します。.lib の操作による MFC グローバルへのアクセスは、ホスティング環境で MFC インフラストラクチャが変更された場合に失敗する可能性があります (VS 6 以降、大きく変更されています)。

MFC ヘッダーで行われた変更を正確に調査したことはありませんが、異なる VS バージョンでコンパイルされた MFC/ATL ベースのクラス バイナリ間で予期しない動作が見られました。

これらの問題に加えて、ランタイム ライブラリで定義された静的グローバル変数に依存する strtok() などの関数にはリスクがあります。よくわかりませんが、マルチスレッド CRT で作成されたスレッドでシングルスレッド CRT を期待するクライアントを使用すると、これらの静的変数が適切に初期化されない可能性があるのではないかと心配しています。詳細については、_beginthread() のドキュメントを参照してください。

于 2009-04-06T22:40:09.593 に答える
3

通常の CRT メモリ境界を保持している限り (つまり、ライブラリ関数内にメモリを割り当てる場合は、ライブラリ内の関数を呼び出して解放することにより、常にライブラリ内からメモリを解放します)、そうしない理由を考える必要はありません。

このアプローチは、すべての種類のコンパイラでコンパイルされた dll で問題なく機能します。静的にリンクされたライブラリも問題ありません。

于 2009-04-06T22:02:39.483 に答える
1

はい。これでまったく問題はないはずです。gbjbaanbが述べたように、メモリを気にする必要がありますが、VS2008 はそれでも動作します。CLR、(マネージ) コードを混在させようとしない限り。可能であれば、反対することをお勧めします。ただし、生の C または C++ コードについて話している場合は、確かに機能します。

具体的に何を使う予定ですか?(このライブラリには何がありますか?) 既に試しましたが、問題が発生していますか? それとも、動作しないものを動作させるために多くの時間を無駄にする前にチェックしているだけですか?

于 2009-04-06T22:07:38.753 に答える
0

きっとうまくいきます。

VS2008 で参照をコーディングする場所を尋ねていますか?

その場合は、プロパティ ページの [構成プロパティ] で [proj props] -> [リンカー] -> [入力] に移動します。「追加の依存関係」を探して、そこに .LIB をコーディングします。

proj props -> Linker -> General に移動し、"Additional Library Directories" に libs パスをコーディングします。

それはそれを行う必要があります!!

于 2009-04-06T22:09:31.290 に答える
0

VS6 から VS2k5 に移行したとき、メモリ モデルが変更され、CRT 機能が異なるため、すべてのライブラリを再構築する必要がありました。

于 2009-04-06T22:12:32.517 に答える
0

VC6、VS2003、VS2005、および VS2008 の間には、いくつかの重大な変更がありました。Visual C++ (VS2005) は、シングル スレッドの静的にリンクされた CRT ライブラリのサポートを停止しました。ここここに列挙されている重大な変更の一部。これらの変更は、以降のバージョンでの VC6 ビルド ライブラリの使用に影響します。

于 2009-05-09T18:12:09.487 に答える