ibrary not found for -xxx
開発中、特にリモート ウェアハウスや github からプロジェクトをクローンする場合にこのエラーに対処することが多く、コンパイル時にこのエラーが報告される可能性があります。以下に示すように:
エラーメッセージ
「-lXXX のライブラリが見つかりません」は、古典的な iOS エラーの 1 つです。以下では、このエラーを再現して解決策を説明します。ここで、l は lib (ライブラリ) を意味します。
まず最初に、私のプロジェクトは、Umeng の統計 SDK を参照していることを述べておきますlibMobClickLibrary.a
。以下に示すように、 third_party ディレクトリに保存されます (左の図はプロジェクト ディレクトリ/仮想ディレクトリ内の libMobClickLibrary.a の場所を示し、右の図はディスク ディレクトリ/物理ディレクトリ内の libMobClickLibrary.a の場所を示します)。
プロジェクトディレクトリ
ディスクディレクトリ
ライブラリ検索パスが構成されていないため、エラーが発生します
(1)building setting -> Library Search Paths
以下を 削除します$(PROJECT_DIR)/YunFu/third_party/UMAnalytics
。以下に示すように:
それでは、なぜ他のパスではなくこのパスを削除する必要があるのかと疑問に思われるかもしれません。このパスが libMobClickLibrary.a 静的ライブラリのディレクトリであることがわかっているためです。
(2) コマンド + B でプロジェクトをコンパイルすると、予想通り、次のエラーが発生します。
(3) このエラーをクリックすると、以下に示すような従来のエラーが表示されます。
このエラーは、MobClickLibrary という名前のライブラリが見つからないことを意味します。
この時点で、ライブラリ検索パスの下の $(PROJECT_DIR)/YunFu/third_party/UMAnalytics を削除しただけで、「-lMobClickLibrary でライブラリが見つかりません」エラーが報告されたことがわかります。したがって、次回同様の問題が発生したときには、特定の静的ライブラリのパスが構成されていない可能性があることがわかります。
結論 1: 静的ライブラリの検索パスの設定に失敗すると、lXXX のライブラリが見つからないというメッセージが表示されます。
注: 設定するパスは、ディスク (物理ディレクトリ) 上の静的ライブラリのパスである必要があり、プロジェクトの仮想ディレクトリに設定することはできません。この例では、libMobClickLibrary.a はプロジェクトの third_party フォルダーに配置されており、その実際のディスク パスは third_party の下の UMAnalytics フォルダーです。
ライブラリ検索パスが正しく構成されていないため、エラーが発生します
上記の状況は、静的ライブラリのパスが設定されていないため、lXXX のライブラリが見つからないというエラーが発生します。場合によっては、[ライブラリ検索パス] で静的ライブラリ パスを設定しても、同じエラーが発生することがあります。この時点で、パスの構成が正しいかどうかを考慮する必要があります。以下に示すように (libMobClickLibrary.a の正しいパスと誤ったパスをそれぞれ):
正しいパス:
正しいパス
間違ったパス (最終レベルのディレクトリ「/UMAnalytics」が削除されます):
間違った道
プロジェクトをコンパイルすると、次に示すように、-lMobClickLibrary.a に対して同じエラー ライブラリが見つからないというエラーが報告されます。
エラーメッセージ
結局のところ、libMobClickLibrary.a のディレクトリを指定したにもかかわらず、指定したディレクトリに静的ライブラリ libMobClickLibrary.a が見つからなかったことが原因です。このとき、次の 2 つの状況が考えられます。
-
状況 1: 指定したディレクトリが静的ライブラリ libMobClickLibrary.a のディレクトリとまったく無関係である場合は、ライブラリ検索パスで再度設定する必要があります (注: 静的ライブラリのディスク パスが設定されています)。
-
ケース 2: 指定したディレクトリが静的ライブラリのディレクトリに関連している場合。つまり、指定するディレクトリは、静的ライブラリが配置されているディレクトリの上位ディレクトリ、つまり上位ディレクトリです。この場合、静的ライブラリの正確なパスを指定する必要はなく、非再帰オプションを再帰に変更する。以下に示すように:
再帰的な設定
再帰オプションは、指定したディレクトリ内の静的ライブラリを再帰的に検索することを意味するためです。つまり、現在のディレクトリに静的ライブラリが見つからない場合は、現在のディレクトリのサブディレクトリで検索を続けます。デフォルトは非再帰的です。
結論 2: 静的ライブラリの検索パスは Library Search Paths で設定されていますが。ただし、構成が正しくないため、lXXX のライブラリが見つかりませんでした。
サードパーティのフレームワーク静的ライブラリをインポートすると、コンパイル エラー xxx.h ファイルが見つかりません
上で説明したのは、プロジェクトが .a 静的ライブラリをインポートするとき、.a 静的ライブラリの検索パスがライブラリ検索パスで構成されていない、またはパスは構成されているがパス構成が間違っているため、ライブラリがインポートされないということです。見つかった - xxx エラーの解決策。
ただし、iOS では、静的ライブラリには .a 形式の静的ライブラリと .framework 形式の静的ライブラリの 2 つの形式があることがわかっています。
では、プロジェクトに .framework 形式の静的ライブラリを導入する場合、検索パスを構成する必要があるのでしょうか? 答えは「はい」です。.framework 静的ライブラリをインポートする方法 (cocoapods またはフレームワーク静的ライブラリをプロジェクトに直接ドラッグする) に関係なく、フレームワークの検索パスが設定されていない場合は、引き続きエラーが報告されます。ただし、.a 形式の静的ライブラリとは少し異なります。プロジェクトにフレームワーク形式の静的ライブラリを導入し、静的ライブラリを使用する場合 (いわゆる使用とは、フレームワークに特定のヘッダー ファイルをインポートすることを意味します)静的ライブラリ) を使用していても、検索パスが設定されていない場合は、「xxx.h ファイルが見つかりません」のようなエラーが報告されます。以下に示すように:
xxx ファイルが見つかりません
私のプロジェクトでは PushCenterSDK.framework という静的ライブラリが導入されているためです。同時に、この静的ライブラリ内の特定の API も使用されます。以下の図に示すように、これらはプロジェクト内の静的ライブラリのパスとディスク パスです。
プロジェクト内のパス
ディスク上のパス
エラーの解決方法を検証するために、引き続き問題を再現する方法を使用します。まず、プロジェクトをコンパイルして渡すことができた後、ビルド設定 -> フレームワークで PushCenterSDK.framework の検索パス (ディスク パス) を削除してみます。検索パスは次のとおりです。写真は削除前と削除後のスクリーンショットです。
削除前:
削除前
削除後:
削除後
パスを削除してプロジェクトをコンパイルした後、以下に示すように、「XXX.h ファイルが見つかりません」というエラーが発生しました。明らかに、
PushCenterSDK の下に TBSDKPushCenterEngine.h ファイルが見つかりませんでした。
エラーを報告する
要約すると、フレームワーク静的ライブラリのパスも必要です。プロジェクト内のフレームワーク静的ライブラリのパスが正しく設定されていない場合、または設定されていない場合は、「xxx.h ファイルが見つかりません」のようなエラーが報告されます。次回この種のエラーが発生した場合は、フレームワークの検索パスについて検討し始めることができます。
同様に、フレームワーク静的ライブラリの検索パスも再帰的検索をサポートしています。正確なパスを設定する必要はありません。親ディレクトリを指定して、再帰的を選択できます。
結論: .framework 静的ライブラリをインポートする方法 (cocoapods またはフレームワーク静的ライブラリをプロジェクトに直接ドラッグする) に関係なく、フレームワークの検索パスが設定されていない場合は引き続きエラーが報告されますが、報告されるエラーは.a 形式の静的ライブラリと同じ 多少異なりますが、プロジェクトにフレームワーク形式の静的ライブラリを導入し、静的ライブラリを使用する場合(いわゆる使用とは、フレームワークの静的ライブラリにヘッダファイルをインポートすることを指します)、検索パスが設定されていない場合は、「xxx.h ファイルが見つかりません」というエラー メッセージが報告されます。