web-dev-qa-db-ja.com

Objective-Cでの外部C ++ヘッダーの使用

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

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

問題は、これらのC++ヘッダーが<>山かっこを使用して相互に含まれていることです。これは次の結果になります:

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

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

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

ありがとう!

22
meaning-matters
#include <bla.h>

標準ライブラリまたはフレームワークヘッダー用であり、検索戦略は

#include "bla.h"

例を見る

回避策として、Xcodeビルド設定「常にユーザーパスを検索」をYESに設定できます。

37
Martin R

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

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

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

    たとえば、ユニバーサルバイナリ(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. 「ライブラリ検索パス」ビルド設定:

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

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

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

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

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

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

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

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

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

    同様に、特定の構成/ターゲットのペアに対して異なるパスが存在する場合があります-ヘッダーは同じであってもかまいません。

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

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

    _ #import <ThirdParty/third_party.hh>
    _
13
CouchDeveloper

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

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

3
Piasy

oSX/Mysqlのための私の2セント。 (ちなみに、なぜmysqlで<>を使用しているのか...とにかく..)

Xcode 11の警告に従って、 "無効にすることを強くお勧めします。"、

「常にユーザーパスを検索する」を「いいえ」のままにして、別の設定にパッチを適用することを好みます。

私は設定しました:

HEADER_SEARCH_PATHS = "/ usr/local/mysql/include"。

リンカー:

I)リンクエラーが発生した場合は、通常、「libmysqlclient.a」を「/ usr/local/mysql/lib」に追加し、Finderからドラッグするだけです)

II:最悪のエラーが発生する...

"/usr/local/lib/libmysqlclient.21.dylib:(/usr/local/lib/libmysqlclient.21.dylib)のコード署名は、ライブラリの検証を使用したプロセスでの使用には無効です:マッピングプロセスとマップファイル(非プラットフォーム) )異なるチームIDを持っている」

そのlibは署名されていません。単に資格で:

(XML):..

<dict>
    <key>com.Apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
...

enter image description here

0
ingconti

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

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

0
Donovanr