4

Visual Studio 2008でVisual Studio 6を使用してコンパイルしたC++静的ライブラリ(.lib)を使用することはできますか?Visual Studio 2008でVisual Studio 6のコンパイル済みC++静的ライブラリを使用できますか?

+0

VS2008でC++で使用できるかどうか、C#やVB.NETなどの管理言語から呼び出すことができるかどうかは疑問です。後者の場合は、質問を編集して明確にします。 –

答えて

3

通常のCRTのメモリ境界を保持している限り(つまり、ライブラリ関数内でメモリを割り当てた場合は、ライブラリ内から解放してください)、libの関数を呼び出して自由)。

このアプローチは、あらゆる種類のコンパイラでコンパイルされたDLLでうまく動作しますが、静的にリンクされたライブラリも大丈夫です。

1

はい。これには何の問題もないはずです。上記のgbjbaanbは、メモリを気にする必要がありますが、VS2008はそれでも動作します。 CLRと(管理された)コードを混ぜようとしていない限り、可能であれば、私はそれに反対することをお勧めします。しかし、生のCまたはC++コードについて話しているなら、確かに動作します。

正確に使用する予定はありますか? (この図書館には何がありますか?)すでに試したことがありますか、問題があるのですか、それとも何かを稼ぐために時間を浪費する前に確認していますか?

+0

私はちょうどそれを働かそうとしている時間の束を無駄にする前に尋ねています。私はコンパイルされた.libライブラリとそれを使用するのに必要なヘッダーファイルしか持っていないので、ライブラリ全体を再コンパイルすることはできませんでした。 –

0

確かにうまくいくでしょう。

VS2008のどこにリファレンスをコーディングするか尋ねていますか?

の場合は、プロパティページの「プロパティ」の「プロジェクタ - >リンカ - >入力」に移動します。 "追加の依存関係"を探し、そこに.LIBを記述します。

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

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

0

答えが「いいえ」だった場合があります。私たちがVS6からVS2k5に移動したときに、メモリモデルが変更され、CRTの機能が異なっているため、すべてのライブラリを再構築する必要がありました。

+0

私のポイント - lib内のすべてのCRTコールを保持すれば問題はありません。リリースとデバッグの混在の間でさえもビルドされます。 libの中のCRT fnを呼び出して、メモリを外部に渡してから、あなたのアプリにそれを操作させて、問題を予測させてください。簡単なカプセル化が答えです。 – gbjbaanb

+0

私はあなたがメモリ割り当ての意味を理解していますが、VS2K5はVS6ライブラリを使用することを拒否しました。それは2年前のことだったので、それが私に与えた正確なエラーは私が覚えていないことです。私たちは何年も再コンパイルされていないライブラリを追跡し、VS2K5で再構築する必要がありました。 –

5

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

見るべき2つの基本的なことがあります。サードパーティのライブラリで使用されるグローバル変数の変更、サードパーティのライブラリで定義されている構造体、クラスなどの構造の変更例えば、CRTメモリアロケータは2つのバージョン間で隠れたアロケーション管理構造を変更した可能性があります。したがって、ライブラリの1つのバージョンでメモリを割り当て、別のメモリを解放するとクラッシュする可能性があります。

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

MFCヘッダーでどのような変更が行われたのか正確には調べていませんが、異なるVSバージョンでコンパイルされたMFC/ATLベースのクラスバイナリ間で予測できない動作が発生しています。

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

0

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

関連する問題