0

複数の Visual Studio プロジェクトを含む非常に大規模なプロジェクトに取り組んでいます。これらのプロジェクトは静的ライブラリとして構築され、メイン プロジェクトに含まれていMain.exeます。

新しいプロジェクトを作成し、それを静的ライブラリとしてビルドしました。これを と呼びましょうMyProj.lib。このライブラリは別の静的ライブラリに依存しています。それを と呼びましょうAPI.lib

ここで、プロジェクトをメイン プロジェクトにリンクする必要があります。現在、両方の静的ライブラリがメイン プロジェクトにリンクされています。以前、次の質問をしました:別の静的ライブラリに静的ライブラリをリンクすると、静的ライブラリをネストできないことがわかりました。Paul Michalik は、メイン プロジェクトをビルドするときに、2 つのライブラリを個別にリンクするだけでよいと指摘しました。

ライブラリで定義されているシンボルが見つからないという、ライブラリからいくつかのLNK2019エラーが表示されます。Visual Studio は両方のライブラリ ファイルの場所を認識しているため、非常に混乱します。何か案は?MyProj.libAPI.lib

4

2 に答える 2

2

この種の混乱は、.lib ファイルが魔法のようなものであるという誤った考えから生じています。リンカーが.lib ファイルに他の依存関係があることを確認できること。そうではありません。静的な .lib は .obj ファイルの単なるバッグです。コンパイラ出力を 1 つのファイルに収集する方法。それ以上でもそれ以下でもありません。

それについて特に混乱しているのは、ライブラリをビルドするときに、依存関係の欠落について決して文句を言わないことです。その説明は簡単です。ライブラリを構築してもリンカは実行されません。.obj ファイルをバッグに集める lib.exe ツールだけです。

リンカーを実際に実行して最終的な実行可能ファイルをビルドするまで、それはまとまりません。ここで、すべてのピースをまとめる必要があります。リンカー、依存関係を含む .obj または .lib ファイルも参照する必要があります。そうでないときは文句を言います。

これは、C/C++ ビルド モデルの非常に弱いリンクであり、修正が困難です。ベンダーはこれに対処しようとしましたが、Microsoft も同様です。非標準の #pragma comment(lib, "something.lib") 機能を追加して、リンカーの追加の依存関係設定で明示的に指定せずに「something.iib」をリンクする必要があることをリンカーに伝えます。非常に素晴らしい。ただし、「something.lib」が格納されている場所を正確に処理することは、対処する必要がある問題です。クラッド。別の設定。

于 2012-09-05T22:03:11.403 に答える
1

最も簡単な解決策は、.libファイルに依存する各プロジェクトにファイルを追加することです。重要な場合 (おそらく VS ではそうではない)、依存ライブラリを依存ライブラリの前に配置します。

これの (考えられる) 欠点は、ライブラリが変更されたときにライブラリが自動的に再コンパイルされないことです。

于 2012-09-05T21:07:00.717 に答える