6

Boost と GLM に依存する Project 1 があります。Boost と GLM については、それぞれの C++ ファイルを参照するために「追加のインクルード ディレクトリ」を指定しました。プロジェクト 1 は、スタティック ライブラリ プロジェクトとして作成されます。Project 1 をビルドすると、すべて正常にビルドされます。Project 2 は Reference Manager を介して Project 1 を参照しますが、Project 2 をビルドすると、

fatal error C1083: Cannot open include file: 'boost/something/etc.

Project 1のファイルの場合。Project 2 をビルドすると Project 1 に関するエラーが発生するのはなぜですか? プロジェクト 1 は、Boost で正規表現ライブラリも使用します。これは.lib、使用する前に に組み込む必要があります。プロジェクト 1 の静的ライブラリに、ビルドされた Boost 正規表現ライブラリと GLM インクルード ファイルを組み込むにはどうすればよいですか? 参考までに、プロジェクト 2 はプロジェクト 1 のテスト プロジェクトです。次のようなものが必要です。

(Boost regex lib + GLM includes) --> Project 1 ==> Project_1.lib

(ブースト単体テスト lib + Project_1.lib) --> Project 2 ==> Project_2.exe

-->依存関係/参照を==>示し、出力を示します。

これは可能ですか?これで車輪を回すと、数え切れないほど多くのコンパイルエラーとリンカエラーが発生しました。

4

2 に答える 2

5

これはおそらく、プロジェクト 2 のコード (ヘッダーおよび/または実装) の一部がプロジェクト 1 のヘッダーをインクルードしているために、プロジェクト 2 のインクルード パスにない外部ライブラリ ヘッダーがインクルードされているためです。すべての を展開すると#include、Project 2 のソース ファイルに次のような行が表示されます。#include <boost/something/etc>これは、Project 2 のインクルード検索パスに含まれていないため、展開できません。

このエラーは、これらの外部ライブラリを静的に .xml にコンパイルしたという事実に関係なく発生しますproject1.lib

問題がなければ、プロジェクト 2 の VC++ ディレクトリ > インクルード ディレクトリへの外部ライブラリ インクルード パスを追加するだけです。

これを回避する 1 つの方法は、多くの外部ライブラリ インクルードをプロジェクト 1 ヘッダーの外側に移動し、PIMPLパターンと前方宣言の組み合わせを使用してそれらを非表示にすることです。ただし、ヘッダーのみのライブラリやテンプレートの多いライブラリなどの場合は、これらのヘッダー パスを含める必要があると思います。機能をカプセル化するか、Project 1 クラス/インターフェイスの背後に実装を非表示にしない限り、それを回避する方法はありません。

于 2012-09-04T15:56:22.753 に答える
1

また、@PreetKukretiの答えは正しいです。ヘッダーを修正した後、デフォルトでは静的ライブラリは外部依存関係とリンクしないため、外部ライブラリ(ブーストとGLM)への依存関係がもう1つあります。これは、ここで説明するエラーの単純なケースによるものです。
たとえばstrlen、CRT の関数を使用し、それを .lib 出力とマージしたい場合は、.lib にstrlenマージされ、次にテスト プロジェクトにマージされます( .exe) をstrlen再度使用しますが、静的ライブラリではすべてがパブリックであることを既に知っているため、CRT と .lib に対してリンクする場合、実装する必要がありstrlen、これによりリンカー エラーが生成されます。
したがって、デフォルトでは、VisualStudio はライブラリの依存関係を .lib ファイルにリンクしません (ソリューションのプロパティ -> ライブラリアン -> ライブラリの依存関係をリンクする) ように指示しない限り、そこで何をしているのか本当にわからない限り、yes に設定しないでください。そして、あなたの行動の結果を受け入れてください!!.
したがって、いずれにせよ、外部ライブラリ (boost & GLM) のパスをプロジェクト 2 のパスに入れるか、プロジェクト 1 を指定された特定のオブジェクトのみを公開する DLL としてビルドし、@PreetKukreti からの回答を使用して移動することをお勧めします。不要なインクルード ファイルを実装 (.cpp) ファイルに追加します。

于 2012-09-06T00:31:11.273 に答える