25

私の iOS プロジェクトでは、C++ で書かれた外部ライブラリを使用する必要があります。C++ ヘッダー ファイルはすべて 1 つのディレクトリにあります。

これらの C++ ヘッダーを Xcode プロジェクトに追加し、(ビルド設定で) ヘッダー検索パスも指定しました。

問題は、これらの C++ ヘッダーが < > 山かっこを使用して相互にインクルードすることです。これにより、次の結果が得られます。

'filename.h' file not found with <angled> include, use "quotes" instead.

奇妙なことに、Xcode はすべてのヘッダーについて文句を言うわけではありません。また、あるファイルで #include された同じヘッダーは問題ありませんが、別のファイルで #include された場合の問題です。これは、これらのヘッダーが相互に #include されていることが原因だと思います。

  1. 検索パスが機能しないのはなぜですか?
  2. これらのヘッダー ファイルを変更せずにこれを解決する方法はありますか?

ありがとう!

4

5 に答える 5

42
#include <bla.h>

は標準ライブラリまたはフレームワークのヘッダー用であり、検索戦略は使用されるものとは異なります

#include "bla.h"

例を参照してください

回避策として、Xcode のビルド設定「Always Search User Paths」を YES に設定できます。

于 2013-07-04T09:28:25.793 に答える
15

「空の」アプリケーション プロジェクトから開始します。

  1. アプリケーションのプロジェクトに "Libraries" フォルダーを作成します。これは、MyApp.xcodeproj ファイルの兄弟として望ましいですが、どこでもかまいません。バイナリがすべてのアーキテクチャを含むユニバーサル バイナリ アーカイブでない限り、構成 (デバッグ、リリースなど) ごとに、また場合によってはアーキテクチャ (armv7、armv7s、arm64) ごとにサブフォルダーを作成します。

  2. サード パーティ ライブラリと静的ライブラリ バイナリのヘッダー (異なるプラットフォーム、構成、アーキテクチャ用に複数の可能性があります) を取得し、それらを "Library" フォルダーの対応するサブフォルダー (作成する必要がある場合があります) に移動します。

    たとえば、ユニバーサル バイナリ (armv7、armv7s、arm64) と、そのライブラリのデバッグ バージョンとリリース バージョンがあるとします。フォルダ構造は次のようになります。

    $(SRCROOT)/Libraries
        Debug-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
        Release-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
    MyApp.xcodeproj            
    
  3. 「ライブラリ検索パス」ビルド設定:

    「Libraries」フォルダーを Xcode プロジェクトにドラッグします。これにより、ビルド設定でライブラリ検索パスが自動的に作成される場合があります。これを確認して、正しくない場合は修正してください。

    この例では、デバッグおよびリリース構成用に次のライブラリ検索パスを追加します。

    デバッグ: ライブラリ検索パス:$(SRCROOT)/Libraries/Debug-iphoneos

    リリース:ライブラリ検索パス:$(SRCROOT)/Libraries/Release-iphoneos

    特定の構成とターゲット プラットフォームのペアに対して、ライブラリ検索パスが異なる場合があります。それに応じて、ビルド設定で別のパスを設定します。

  4. 「ヘッダー検索パス」ビルド設定:

    この例では、次のヘッダー検索パスをデバッグおよびリリース構成に追加します。

    デバッグ:ヘッダー検索パス:$(SRCROOT)/Libraries/Debug-iphoneos/include

    リリース:ヘッダー検索パス:$(SRCROOT)/Libraries/Release-iphoneos/include

    同様に、特定の Config/Target ペアのパスが異なる場合がありますが、ヘッダーは同じ場合があります。

  5. Other Linker Flagsビルド設定に追加-lc++して、アプリを C++ 標準ライブラリにリンクします。

  6. 次のように、ファイルにヘッダーをインポートします。

     #import <ThirdParty/third_party.hh>
    
于 2013-07-04T10:05:59.780 に答える
0

ライブラリのディレクトリを指すように「ユーザー ヘッダー検索パス」を設定した後、XCode では、「常にユーザー パスを検索する」というフィールドが「はい」に設定されていることも確認する必要があります。

これにより、私が抱えていた問題が解決しました。 <boost/signals2.hpp> ファイルが <angled> インクルードで見つからない場合は、代わりに「引用符」を使用してください。

于 2014-04-09T17:28:26.147 に答える