私のiOSプロジェクトでは、C++で記述された外部ライブラリを使用する必要があります。 C++ヘッダーファイルはすべて1つのディレクトリにあります。
これらのC++ヘッダーをXcodeプロジェクトに追加し、ヘッダーの検索パス(ビルド設定)も指定しました。
問題は、これらのC++ヘッダーが<>山かっこを使用して相互に含まれていることです。これは次の結果になります:
'filename.h' file not found with <angled> include, use "quotes" instead.
奇妙なことに、Xcodeはすべてのヘッダーについて文句を言うわけではありません。また、1つのファイルに#includeされた同じヘッダーは問題ありませんが、別のファイルに#includeされた場合の問題です。これは、これらのヘッダーがお互いに#includeしているという事実が原因であると思います。
ありがとう!
#include <bla.h>
標準ライブラリまたはフレームワークヘッダー用であり、検索戦略は
#include "bla.h"
例を見る
回避策として、Xcodeビルド設定「常にユーザーパスを検索」をYESに設定できます。
「空の」アプリケーションプロジェクトから開始:
アプリケーションのプロジェクトに「ライブラリ」フォルダを作成します-MyApp.xcodeprojファイルの兄弟として推奨されますが、どこにあってもかまいません。バイナリがすべてのアーキテクチャを含むユニバーサルバイナリアーカイブでない限り、各構成(デバッグ、リリースなど)、および場合によっては各アーキテクチャ(armv7、armv7s、arm64)のサブフォルダを作成します。
サードパーティライブラリのヘッダーと静的ライブラリバイナリ(異なるプラットフォーム、構成、アーキテクチャでは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
_
「ライブラリ検索パス」ビルド設定:
「ライブラリ」フォルダをXcodeプロジェクトにドラッグします。これによりmayがビルド設定にライブラリ検索パスを自動的に作成します。これを確認し、正しくない場合は修正してください。
この例の場合、デバッグおよびリリース構成用に次のライブラリ検索パスを追加します。
デバッグ:ライブラリ検索パス:$(SRCROOT)/Libraries/Debug-iphoneos
リリース:ライブラリ検索パス:$(SRCROOT)/Libraries/Release-iphoneos
特定の構成プラットフォームとターゲットプラットフォームのペアに対して、異なるライブラリ検索パスがある場合があります。それに応じて、ビルド設定で異なるパスを設定します。
「ヘッダー検索パス」ビルド設定:
この例では、次のヘッダー検索パスをデバッグとリリース構成に追加します。
デバッグ:ヘッダー検索パス:$(SRCROOT)/Libraries/Debug-iphoneos/include
リリース:ヘッダー検索パス:$(SRCROOT)/Libraries/Release-iphoneos/include
同様に、特定の構成/ターゲットのペアに対して異なるパスが存在する場合があります-ヘッダーは同じであってもかまいません。
_-lc++
_をOther Linker Flagsビルド設定に追加して、アプリをC++標準ライブラリにリンクします。
次のようにファイルにヘッダーをインポートします。
_ #import <ThirdParty/third_party.hh>
_
Xcode 9では、Header Search Paths
ではなくUser Header Search Paths
ビルド設定にヘッダーファイルパスを追加する必要があります。
XcodeはUser Header Search Paths
を-iquote
オプションとしてコンパイルコマンドに追加しますが、Header Search Paths
を-I
オプションとして追加します。それが大きな違いです。
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>
...
ライブラリのディレクトリを指すように「ユーザーヘッダー検索パス」を設定した後のXCodeでは、「常にユーザーパスを検索」というフィールドが「はい」に設定されていることを確認する必要もあります。
これにより、私が抱えていた問題が解決しました。<boost/signals2.hpp>ファイルが<angled> includeで見つからない場合は、代わりに "quotes"を使用してください。