今私は私のObjCフレームワークをSwiftに移行したいと思います、そして私は次のエラーを得ました:
include of non-modular header inside framework module 'SOGraphDB'
参照は単にプロトコルを定義するヘッダーファイルへの参照であり、私はこのプロトコルを使用するためにいくつかのクラスでこのヘッダーファイルを使用します。
モジュールの機能に関連しているようですが、現時点では修正方法があまり明確ではありません。解決策をご存知ですか。
更新:
これはSwiftコンパイラのエラーです。
アップデート2:
簡単な解決策(根本的な原因は解決しない)は、次の設定をyesに設定することです。CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
あなたのヘッダは公開されていますか?
プロジェクトエクスプローラでヘッダファイルを選択します。次に、xcodeの右側のセクションで、ターゲットの横にドロップダウンがあることに気付くでしょう。それを "project"から "public"に変更してください。これは私のために働きました。
これは予想されるコンパイラの動作であり、非常に正当な理由です。
Application Target
からFramework Target
に切り替えて、CとObjective Cのヘッダをフレームワークのアンブレラヘッダに追加し始めた後に、この問題に遭遇する人々の大半が同じ動作をすると思いますasアプリケーションのBridging Headerは、動作が異なります。アンブレラヘッダは、実際にはSwiftとobj-cの混在するフレームワーク用に指定されており、その目的は、あなたのフレームワークが目的とするcまたはcのAPIを外部の世界に公開することです。つまり、そこに置くヘッダはパブリックスコープ内にあるべきです。
あなたのフレームワークの一部ではないObjective-C/CヘッダをあなたのフレームワークのSwiftコードにさらす場所としてそれを使うべきではありません。その場合、これらのヘッダもフレームワークモジュールの一部として外部に公開されるため、モジュール性が損なわれるため、これはやりたくないことがよくあります。 (そしてそれがまさにフレームワークモジュールへの非モジュラーインクルードを可能にするデフォルトはNOです)
Objective-C/CライブラリをフレームワークのSwiftコードに公開するには、そのようなライブラリ用に別のSwiftモジュールを定義する必要があります。それから、標準のSwiftのimport YourLegacyLibrary
を使うことができます。
私たちのフレームワークにlibxml2
を埋め込むという典型的なシナリオでこれを説明しましょう。
1。最初にこのように見えるmodule.modulemap
ファイルを作成する必要があります。
OSXフレームワークの場合:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
iOSフレームワークの場合:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
それがすることはそれがSwiftモジュールの中でそれが参照するヘッダーと他のすべてのヘッダーをラップすることです、それでSwiftはこれらのCインターフェースのためにSwiftバインディングを生成することができるでしょう。
2。次にxcodeプロジェクトディレクトリにフォルダSwiftLibXML2
を作成し、このmodule.modulemapをそこに置きます。
3.ビルド設定で、ヘッダー検索パスに$(SDKROOT)/usr/include/libxml2
を追加します
4。ビルド設定で、インポートパスに$(SRCROOT)/SwiftLibXML2
を追加します
5.プロジェクトの一般タブで、リンクされたフレームワークとライブラリにlibxml2.tbd
を追加します 。
これで、必要に応じてこのモジュールをインポートしました。
import SwiftLibXML2
(より完全なmodule.mapの例を見たい場合は、/usr/include/module.modulemap
でDarwinのmodule.modulemapを参照することをお勧めします。そこに行くにはXcodeコマンドラインツールをインストールする必要があります。参照 Missing/usr/include OS X El Capitanでは )
クイックフィックスを自動的に適用する方法は次のとおりです。Pods.xcodeproj
ごとに手動でpod install
を変更する必要はありません。
このスニペットをPodfileの最後に追加してください。
post_install do |installer|
installer.pods_project.build_configuration_list.build_configurations.each do |configuration|
configuration.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
end
end
私にとっての解決策は、続行することでしたターゲット - >ビルド設定 - >非モジュラーインクルードを許可フレームワークモジュールでYESに切り替えます!
Swiftで:
1。下記のようにXcodeプロジェクトとターゲットのビルド設定を変更します。
フレームワークモジュールに非モジュラーインクルードを許可する:いいえ
ビットコードを有効にする:はい
2。 GoogleMaps iOS SDKで入手可能な最新バージョンを使用してください(入手にはCocoaPodsを使用してください)。
GoogleMaps(1.10.4)
3。問題のあるインポートにコメントする:
//import GoogleMaps
4。問題のあるインポートを追加して、ブリッジヘッダーファイルを作成または変更します。
[あなたのXcodeプロジェクト名] -Bridging-Header.h
// Use this file to import your target's public headers
// that you would like to expose to Swift.
#import <GoogleMaps/GoogleMaps.h>
5。 Xcodeプロジェクトをクリーンアップして再ビルドします。
私はこれを回避したと思います。フレームワーク内でsqlite3を使用するモデルコードがあります。私の場合、犯人は<sqlite3.h>でした。
問題は、私のModule/Module.hヘッダーに、<sqlite3.h>をインポートするパブリックヘッダーをインポートしたことです。解決策は、すべてのsqlite3_xxxタイプを隠し、それらがどのパブリック.hにも表示されないようにすることでした。 sqlite3への直接参照はすべて非公開にされるか、またはプロジェクトの可視性にされました。例えば、私はいくつかのsqlite3_stmtポインターがそれからぶら下がっているパブリックシングルトンを持っていました。私はそれらを別のクラスに移動しましたが、これは現在そのパブリックヘッダー内の単なる前方宣言です。今私は建てることができます。
ちなみに、CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES設定は機能しませんでした。私はフレームワークと依存プロジェクトの両方でそれを設定しようとしました。理由は定かではありませんが、この回避策は必要でした。
この答えは時代遅れです。
フレームワークをインポートするときは、ルートヘッダと依存関係を共有するすべてのヘッダファイルをインポートする必要があります。これが常に機能することを確認する最も簡単な方法は、フレームワークの "Headers"フォルダー内のすべてのヘッダーをあなたの公開ヘッダーパスにインポートすることです。
Swiftコンパイラはこの情報を使用して、関連付けられている型情報とともに、マングル化されていないシンボルのマップを生成します。
ヘッダファイルはターゲットに割り当てられていましたが、プロジェクト可視としてマークされていただけで、publicへの変更はこのエラーの解決につながりました。
しない
#import "MyOtherFramework.h"
する
#import <MyOtherFramework/MyOtherFramework.h>
私はこれが古い質問であることを知っています、しかし私は同じ問題を抱えていて、上から何も助けになりませんでした。だから私は私の答えが誰かに役立つことを願っています。私の場合、問題はALWAYS_SEARCH_USER_PATHS設定にありました。それがNOプロジェクトに設定されていて、うまく動いたとき。しかし、ポッドの1つがYESに設定されることを要求している限り、エラーを受け取りました。
フレームワークモジュール内に非モジュラーヘッダを含める
数杯のコーヒーと終日の調査の後、私は Xcode 7.1 Beta 2リリースノートの既知の問題 に従って、次のことを発見しました。
•以前にコンパイルしたフレームワークに対して「フレームワークモジュール内に非モジュラヘッダを含める」というエラーが表示される場合は、「常にユーザパスを検索する」ビルド設定を「いいえ」に設定してください。レガシーの理由でのみ、デフォルトは "Yes"です。 (22784786)
私はXCode 7.3を使っていましたが、このバグはまだ修正されていないようです。
私もこの問題に関する私の経験を加えたいと思います。
要約すると:
<framework/headerName.h>
のようにではなく、この"headerName.h"
のように傘のヘッダーにヘッダーを含めるなら、問題は消えることを発見した。私はこれを最後に試しましたが、今のところこの問題はもう経験していませんが、この解決策はあなたがいくつかのトップの答えを適用した場合にのみ有効であると思います。 、モジュールアプローチおよび非モジュラーヘッダの許可には、が含まれます。
切り替えビルド設定>フレームワークモジュールに非モジュラーインクルードを許可するYES!私にとって同じ問題を解決しました。
プロジェクトに自分のフレームワークを含めるとき、私はこの正確な問題を抱えていました。 sqlite3.hのすべてのインポートを.hファイルではなく.mファイルに入れることで修正されました。私は他のライブラリがXcodeに関する同様の問題にフラグを立てるかもしれないと思います。
プロジェクトをSwift2からSwift3に更新した後にこの問題が発生しました。私はコードの更新にXCode 8.3.2を使用していましたが、エラー「フレームワークモジュール内の非モジュラーヘッダ」を取り除くことができませんでした。同じプロジェクトを別のバージョンのXCode(バージョン9.0.1)で開いても、エラーが表示されませんでした。
私はFacebook 4.02 sdkとFBSDKCoreKitに関して特別な問題を抱えていました。
すべての手順を実行しましたが、それでも非モジュールヘッダーについてはエラーになります。フレームワークから特定のヘッダーのみをドラッグアンドドロップして、phase-> headerセクションを構築します。
それから自動的に上部のプロジェクトナビゲータにヘッダーのコピーを作成しました。
私はそれをビルドフェーズ - >ヘッダーから取り除き、そして新しいファイルを削除し、そしてうまく働きました。
それがリセットされたか何かのように。
ほとんどの場合、このエラーは選択した回答が原因ですが、フレームワークファイルを新しいプロジェクトフォルダーにドラッグしたときに、このエラーが偶然に1回表示されることがありました。私はフレームワークを削除するためにクリックしましたが、実際にファイルを完全に削除するのではなく、誤ってフレームワークへの '参照の削除'だけを押しました。この時点でプロジェクトフォルダをFinderで開くと、 'CoreLocation'や 'AudioToolbox'のようなファイルがあります。プロジェクトフォルダからこれらのファイルを削除し、プロジェクトを消去すると問題が解決しました。
非モジュールインクルードのインポートを許可した後、Objective-C Bridgingヘッダを使ってそのモジュールをインポートしようとすることができます。
#import <YandexMobileMetrica/YandexMobileMetrica.h>
私の場合(Xcode 9 Beta 6 - Swift 4 - Cocoapodsを使用)、Podfile.lockとPodsディレクトリを削除してpod install
を再度実行すると解決しました
フレームワークからModules
name__フォルダーを削除することで解決しました。
Finderを使用して、Appプロジェクトに存在するフレームワークの場所を参照してください。
Test.framework
フォルダの中に入って(上記の場合はSOGraphDB.framework
になります)、Modules
name__フォルダを削除します。
クリーンと再アプリを構築し、それは問題を解決します。