Swiftコンパイラエラー:「フレームワークモジュール内の非モジュールヘッダー」


204

次に、ObjCフレームワークをSwiftに移行したいと思います。次のエラーが発生しました。

include of non-modular header inside framework module 'SOGraphDB'

参照は、プロトコルを定義するだけのヘッダーファイルであり、このヘッダーファイルをいくつかのクラスで使用して、このプロトコルを使用しています。

モジュール機能に関連しているようですが、現時点では修正方法がはっきりしていません。解決策を知っていますか?

更新:

これはSwiftコンパイラエラーです。

更新2:

迅速な修正(根本的な原因を解決しない)は、次の設定をyesに設定することです:CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES


3
「CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES」の新しいビルド設定があるようです
Stephan

1
パブリックでモジュール式のインクルードをこれで見た人はいますか?:私はバニラ(cocoapods)プロジェクトでこれを見github.com/CocoaPods/CocoaPods/issues/3092dropbox.com/s/trhe5vwhzoa9bf5/...
クリス・コノバー

これを自動的に有効にする簡単なスクリプトを作成した人はいますか?
ファトホク

@fatuhoku yeah
funroll

これらの解決策はどれもうまくいきませんでした。私の場合、bolts.frameworkの衝突のようです。削除すると問題は解決しました:stackoverflow.com/a/33114309/3324388
Aggressor

回答:


316

ヘッダーは公開されていますか?

プロジェクトエクスプローラーでヘッダーファイルを選択します。次に、xcodeの右側のセクションで、ターゲットの横にドロップダウンがあることに気づくでしょう。それを「プロジェクト」から「パブリック」に変更します。これでうまくいきました。

公開ヘッダー


私が述べたのと同じであっても、私はこの答えを受け入れます。
ステファン

フレームワークのヘッダー構築フェーズに移動して、パブリック、プロジェクト、プライベートのヘッダーをすばやく確認することもできます。
ホセアイバニーズ

私はここに来る前に1時間以上これと戦ったので、この単純なタスクが解決策になる可能性があるとは思いませんでした。驚いたことに、これはまさにソリューションであり、すぐに機能しました。
TMc、2015年

1
そして、これらのヘッダーを内部にしたい場合はどうなりますか?
Raphael

2
これも私の問題を解決します!私の場合、別のポッドに依存している1つのポッドは、モジュールの問題のためインポートできません。そこで、パブリックモードを使用して、別のポッドのターゲットとして含まれるヘッダーをいくつか作成しました。そしてそれは問題を解決します!
Chen Li Yong

135

これは予想されるコンパイラの動作であり、非常に正当な理由があります。

私は、彼らはから切り替えた後、この問題に実行している人々の大部分が発生していると思うApplication TargetFramework Targetと、フレームワークのにCとObjective Cヘッダの追加を開始アンブレラヘッダそれは同じ振る舞い持つように期待して、アプリケーションのブリッジングヘッダー動作が異なります。アンブレラヘッダーは、実際にはスウィフトとobj-cの混合フレームワーク用に指定されており、その目的は、フレームワークがObjective-CまたはCに持つ外部の世界にAPIを公開することです。つまり、そこに配置するヘッダーはパブリックスコープにある必要があります。

フレームワークの一部ではないObjective-C / Cヘッダーをフレームワークの迅速なコードに公開する場所として使用しないでください。その場合、これらのヘッダーは、フレームワークモジュールの一部として外部の世界にも公開されるため、モジュール性が損なわれるため、多くの場合、これは目的ではありません。(そして、その理由を正確にされて非モジュラーフレームワークモジュールに含まれています。デフォルト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. ProjectのGeneralタブで、Linked Frameworks and Librariesに追加libxml2.tbdします。

次に、このモジュールを必要な場所にインポートします。

import SwiftLibXML2

(より完全なmodule.mapの例を確認したい場合は、Darwinのmodule.modulemapを参照することをお勧めします。/usr/include/module.modulemapそこに移動するには、Xcodeコマンドラインツールをインストールする必要があります。OSX El CapitanのMissing / usr / includeを参照してください。)


1
ファイル名module.mapは廃止されました。名前はmodule.modulemap clang.llvm.org/docs/Modules.html#attributes
Hyperbole

import SwiftLibXML2Objective-Cでの使用方法 ありがとう!
イタチ

他のobj-cインポートと同じ方法:#import <libxml / xpath.h>ですが、手順3〜5を実行したことを確認してください。
アンビエントライト16

これを行いましたが、ビルドアーティファクトはマシン間で移動できません。Objective-C(サブ)モジュールは、絶対パスを使用してリンクされているため、出荷したフレームワークを使用するアプリをコンパイルするとエラーが発生します。
ラファエル

エラーはおそらくビルドプロセスに固有です。これはモジュール定義にすぎないため、モジュールをサポートするllvm言語が他の言語と相互運用できます。それ自体がビルドアーティファクトに影響を与えるとは考えられません。間違っている
アンビエントライト2017年

55

クイックフィックスを自動的に適用する方法は次のとおりです。そのため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

29

私のための解決策は、ターゲットに移動することでした- >ビルド設定->フレームワークモジュールの非モジュール式インクルードを許可するように切り替えます!


ココアポッドとの連携もここで行いました。ポッドのインストール後、他の回答から魔法をかける必要はありません
ブレインレイ

3
私はこのステップを実行しました..しばらく動作しましたが、今は動作していません...ポッドインストールステップも含めました。しかし、今は再び失敗しています。チェックすべき他のことはありますか?ヘッダーをパブリックに変更するオプションとしてGoogleMobileAds.Frameworkが表示されません。
マイケル・ロウ

これは私にはうまくいきませんでした。まだParseでエラーが発生します。Xcode 7.3.1
C0D3

XCodeを機能させるには、この変更を行った後にXCodeを再起動する必要がありました。
ジョンファウラー

1
この設定を変更するとどのような影響がありますか?
nr5

15

私はこれを回避したと思います。フレームワークでsqlite3を使用するモデルコードがあります。私の場合、犯人は<sqlite3.h>でした。

問題は、私のModule / Module.hヘッダーで、<sqlite3.h>をインポートしたパブリックヘッダーをインポートしたことです。解決策は、すべてのsqlite3_xxxタイプを非表示にし、パブリック.hに表示されないようにすることです。sqlite3へのすべての直接参照は、プライベートまたはプロジェクトの可視化されました。たとえば、いくつかのsqlite3_stmtポインターがぶら下がっているパブリックシングルトンがありました。それらを別のクラスに移動しましたが、現在はそのパブリックヘッダーの前方宣言のみになっています。これでビルドできます。

ちなみに、CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES設定は機能しませんでした。フレームワークと依存プロジェクトの両方で設定してみました。この回避策は必要でしたが、理由はわかりません。


これは完全に役に立ちました!私の場合、それは到達可能性でした。
Daniel Brim

4
フレームワークモジュールにSSZipArchiveを含めようとしたときに、これが私の問題の解決策であると確信しています。パブリックヘッダーが<zlib.h>に違反しており、同じエラーが発生しています。私はあなたの答えの一部しか理解していないので、私がそれを機能させるのに苦労しているので、どこかにソースコードを投稿できますか。
Bruce

15

ではスウィフト

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プロジェクトをクリーンアップして再ビルドします。


1
これは大いに役立ちます!GoogleMobilAdsフレームワーク(Cocoapodsを使用)との連携も良好
bluenowhere 2015年

見出しファイルを作成する方法詳細については、以下を参照してくださいstackoverflow.com/a/51227304/529663
lenooh

6

この回答は古くなっています。

フレームワークをインポートするときは、ルートヘッダーと依存関係を共有するすべてのヘッダーファイルをインポートする必要があります。これが常に機能することを確認する最も簡単な方法は、フレームワークの「Headers」フォルダー内のすべてのヘッダーをパブリックヘッダーパスにインポートすることです。

ここに画像の説明を入力してください

Swiftコンパイラーはこの情報を使用して、マングルされていないシンボルとそれに関連するタイプ情報のマップを生成します。


これは、Frameworkファイルを作成する目的に反するようですが、私にとってはうまくいきました。ChartboostとRevMobの両方が最近、ライブラリだけでなくフレームワークファイルの使用を開始しました。ヘッダーからアプリのヘッダーにすべてをコピーすると、問題が解決します。
Jason Short

これが唯一の解決策ですか?私には6つのフレームワークがあり、各フレームワークには約20のヘッダーがあります。混乱を引き起こします。他に何かありますか?
vivin

1
ありそうです。これはXcodeのバグの回避策だったため、おそらく関係ありません。
SEOの

6

しない

#import "MyOtherFramework.h"

行う

#import <MyOtherFramework/MyOtherFramework.h>

3

ヘッダーファイルはターゲットに割り当てられましたが、プロジェクト表示のみとしてマークされていました。パブリックに変更しただけで、このエラーは解決されました。


正確にはどうすればよいですか?TwitterKitヘッダーファイルで問題が発生している
Vinod Sobale '15年

2

これは古い質問であることはわかっていますが、同じ問題があり、上からの助けにはなりませんでした。だから私は私の答えが誰かのために役立つことを願っています。私の場合、問題はALWAYS_SEARCH_USER_PATHS設定にありました。プロジェクトがNOに設定されている場合、プロジェクトは構築され、正常に機能しました。しかし、ポッドの1つがYESに設定する必要がある限り、エラーを受け取りました

フレームワークモジュール内に非モジュールヘッダーを含める

数杯のコーヒーと一日中調査した後、Xcode 7.1 Beta 2リリースノートの既知の問題によると、次のことがわかりました。

•以前にコンパイルしたフレームワークで「フレームワークモジュール内に非モジュールヘッダーを含める」というエラーが発生した場合は、[常に検索するユーザーパス]ビルド設定が[いいえ]に設定されていることを確認してください。デフォルトは、従来の理由でのみ「はい」です。(22784786)

私はXCode 7.3を使用していましたが、このバグはまだ修正されていないようです。


これは私を助けたものです!NOに切り替えた後、一部のインポートを変更する必要がありましたが、必要なフレームワークをインポートできるようになりました。
Pavel Gurov

2

ビルド設定の切り替え >フレームワークモジュールの非モジュール式インクルードを許可する私のために同じ問題を解決しました。


2

問題についての私の経験も追加したいと思います。

要約すると:

  • @ambientlightの答えは素晴らしく、ほとんどの問題が修正されます。
  • 非モジュラーヘッダーを許可することも別のソリューションです(上記の回答のいくつかを参照してください)。
  • フレームワークのヘッダーをパブリック(公開するヘッダーのみ)としてマークし、それらをアンブレラヘッダーにインポートします。

上記の回答への私の2つの追加は次のとおりです。

  • フレームワークを直接インポートするヘッダーがないか、プロジェクトのインポートを慎重にチェックします(可能な場合は、前方宣言を使用する代わりに)。別のヘッダーファイル内にヘッダーファイルを含めることはお勧めしません。これが問題を引き起こすことがあります。適切に行わないと、1つのヘッダーが複数インクルードされ、リンカーの問題が発生する可能性があるためです。
  • 更新:ライブラリのアーキテクチャと、リンクするターゲットのアーキテクチャが一致することを確認してください。
  • そして最後に、上記のすべてを行った後も、私はまだそのエラーにぶつかっていました。だから私はもう少し掘り下げて(アップル開発者フォーラムで、リンクを失いました:()、このようなアンブレラヘッダーにヘッダーを含めると、このようにはなりません<framework/headerName.h>"headerName.h"、問題はなくなります。

私はこれを最後に試してみましたが、これまでのところこの問題は経験していませんが、この解決策は、トップアンサーの一部を適用した場合にのみ有効であると思います(注:それらはすべて相互に互換性があるわけではないため、たとえば、モジュールアプローチと非モジュールヘッダーインクルードの許可)。


1

自分のフレームワークをプロジェクトに含めるときに、この正確な問題がありました。sqlite3.hのすべてのインポートを、パブリック.hファイルではなく.mファイルに配置することで修正しました。他のライブラリがXcodeで同様の問題を報告していると思います。


1

Facebook 4.02 sdkとFBSDKCoreKitに特有の問題がありました。

すべての手順を実行しましたが、非モジュラーヘッダーに関するエラーがまだあります。フレームワークから特定のヘッダーのみをドラッグアンドドロップして、フェーズ->ヘッダーセクションを構築します。

次に、上部のプロジェクトナビゲーターにヘッダーのコピーを自動的に作成しました。

私はそれをビルドフェーズ->ヘッダーから削除し、新しいファイルを削除して正常に動作しました。

リセットか何かのように。


1

私の場合には(Xcodeの9ベータ6 -スウィフト4 - Cocoapodsを使用して)私は削除したとき、これが解決されたPodfile.lockポッドのディレクトリをと走っpod install再び


1

プロジェクトをswift2からswift3に更新した後、この問題が発生しました。XCode 8.3.2を使用してコードを更新していましたが、「フレームワークモジュール内の非モジュールヘッダー」というエラーを取り除くことができませんでした。XCodeの別のバージョン(バージョン9.0.1)で同じプロジェクトを開いたときに、エラーは表示されませんでした。


0

ほとんどの場合、このエラーは選択した回答が原因で発生しますが、フレームワークファイルを新しいプロジェクトフォルダーにドラッグすると、誤ってこのエラーが一度表示されました。フレームワークを削除するためにクリックしましたが、実際にファイルを完全に削除するのではなく、誤ってフレームワークへの「参照の削除」のみを押しました。この時点で、Finderでプロジェクトフォルダーを開くと、 'CoreLocation'や 'AudioToolbox'などのファイルが表示されました。これらのファイルをプロジェクトフォルダーから削除し、プロジェクトをクリーンアップすると、問題が修正されました。


0

非モジュール式インクルードのインポートを許可した後、Objective-Cブリッジングヘッダーを使用してそのモジュールをインポートしようとすることができます。

#import <YandexMobileMetrica/YandexMobileMetrica.h>

0

Modulesフレームワークからフォルダーを削除することで解決しました。

  • ファインダーを使用して、App Projectにあるフレームワークの場所を参照します

  • Test.frameworkフォルダ内に移動(上記の場合はSOGraphDB.framework)&Modulesフォルダを削除します。

  • アプリを削除して再構築すると、問題が解決します。


-1

Parseフレームワークのインポートでこの問題が発生しました。私が修正できる唯一の方法は、前回のコミット以降のすべての変更を破棄し(単純にフレームワークを削除してプロジェクトをクリーンアップできなかった)、他の必要なフレームワークと共に(SDKの新規ダウンロード後に)Parseを再度追加することでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.