2013-07-04 12 views
11

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

これらのC++ヘッダーを自分のXcodeプロジェクトに追加しました。また、(Build Settingsの)ヘッダー検索パスも指定しました。

これらのC++ヘッダーは、角括弧[<]を使用して相互に組み込みます。結果は次のようになります。

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

Xcodeはすべてのヘッダーについて不平を言っていません。 1つのファイル内の同じヘッダ#includeは上手く、別のファイルに#includeしたときの問題です。私はこれがこれらのヘッダーが#​​includeという事実によって引き起こされると思う。

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

ありがとう!

+0

そのC++ライブラリのソースとXcodeプロジェクトはありますか? – CouchDeveloper

+0

@CouchDeveloperいいえ、私はしません。 –

+4

「常にユーザーパスを検索する」ビルド設定の設定は役に立ちますか? –

答えて

26
#include <bla.h> 

は、標準ライブラリやフレームワークヘッダのためのもの、および検索方法 は

#include "bla.h" 

を参照してくださいするために使用されるものと異なっていますこの問題を回避するには、t Xcodeは「常にユーザーパスを検索」を「はい」に設定します。 「ブランク」アプリケーションプロジェクトから始まっ

+1

"Always Search User Paths"をYESに設定すると、ヘッダーの問題が発生する可能性があることに注意してください。これをNOに設定することを強くお勧めします。これは正しい方法です。後方互換性のためだけにまだそこにある。サードパーティライブラリのヘッダーは山括弧で囲む必要があります。 – CouchDeveloper

+0

@CouchDeveloper:これは回避策として意図されていましたが、あなたが正しいですし、あなたの答えはおそらくよりよい解決策です。 –

+0

@CouchDeveloperは、この設定をNOに設定することに同意しますが、組み込みフレームワーク構築のコンテキストでは、この設定をYESに設定することは望ましくありません。 –

11

: - あなたのMyApp.xcodeprojファイルに兄弟として望ましいが、それはどこでもすることができ

  1. は、アプリケーションのプロジェクト内のフォルダ「ライブラリ」を作成します。バイナリがすべてのアーキテクチャを含むユニバーサルバイナリアーカイブでない限り、各コンフィギュレーション(デバッグ、リリースなど)、場合によっては各アーキテクチャ(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. 「ライブラリ検索パス」ビルドセtting:

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

    例を考えると、デバッグのための次のライブラリ検索パスを追加して、コンフィギュレーションをリリース:

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

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

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

  4. "ヘッダ検索パス" ビルド設定:

    例を考えると、DebugとReleaseの設定に以下のヘッダ検索パスを追加します。

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

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

    同様に、特定のConfig/Targetペアに対して異なるパスを使用することもできますが、ヘッダーは同じでもかまいません。

  5. -lc++に追加することで、アプリをC++標準ライブラリにリンクすることができます。その他のリンカーフラグビルド設定。次のように

  6. は、ファイルのヘッダをインポートします:Xcodeで

    #import <ThirdParty/third_party.hh> 
    
+0

私の場合、そのエラーはターゲットに依存していたので、助けになりました。 –

+0

壮大な、私は角度を作ることができる私はそれをパッチしたいので、私は私のプロジェクトで持っているサードパーティのライブラリとの作業が含まれています。ありがとう。 – aledalgrande

1

ライブラリのディレクトリを指すように「ユーザヘッダ検索パス」を設定した後、あなたはまた、ことを確認する必要があり<ブースト/ signals2.hppで<角度の>では見られない>ファイルは、「引用符」を使用し、次のとおりです。「常にユーザーのパスを検索する」というフィールドがこれは私が持っていた問題を解決する「はい」

設定されています代わりに。

1

Xcode 9では、User Header Search Pathsではなく、Header Search Pathsのビルド設定にヘッダファイルのパスを追加する必要があります。

Xcodeは-iquoteオプションとしてコマンドをコンパイルするためにUser Header Search Pathsを追加しますが、-IオプションとしてHeader Search Pathsを追加します。それが重要な違いです。

+0

これを指摘してくれてありがとう。 (私はそれを確認する時間がなかった、私はあなたを信頼しています。) –

関連する問題