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


143

Xcode 6を使用しています

1)最初に、動的ライブラリ(CoreLibrary)を作成しています。このライブラリには、RequestPoster.hファイルが含まれています。

2)次に、Cocoa Touch Frameworkを作成し、この動的ライブラリ(CoreLibrary)を追加しました。

3)次に、このフレームワークがプロジェクトに追加され、RequestPoster.hファイル(CoreLibrary)でエラーが発生します。

エラー:フレームワークモジュールクラス内に非モジュールヘッダーが含まれています:

ifaddrs.h、arpa / inet.h、sys / types.h>

これらのファイルはプロジェクトで見つかりません。

回答:


190

「ターゲット」の下の「ビルド設定」に移動して、「フレームワークモジュールの非モジュール式インクルードを許可する」をYESに設定してください。

本当の答えは、ライブラリの所有者がインポートの場所を変更する必要があるということです。これらのファイルifaddrs.h、arpa / inet.h、sys / types.hは、Xcodeが好まないフレームワークの.hファイルにインポートされます。ライブラリのメンテナは、それらを.mファイルに移動する必要があります。たとえば、AFNetworkingが同じ問題を修正したGitHubのこの問題を参照してください:https : //github.com/AFNetworking/AFNetworking/issues/2205


2
エラーのあるヘッダーがインポートされたヘッダーのタイプを使用している場合、何をお勧めしますか?たとえば、モジュールのヘッダーmodule.hがtypeのパラメーターを取る関数を宣言している場合ifaddrs、それらはifaddrs.hをインポートするようにバインドされています。
Ayush Goel

しかし、システムインクルードの場合は/usr/include/libproc.hどうでしょうか。
Ben Leggiero、2018年

3
変更の影響について説明してください:フレームワークモジュールで非モジュール式の
インクルードを

おそらく最良の答えは、基本的にこのエラーを沈黙させるのではなく、それをモジュラーヘッダーにすることだと思います。Appleがモジュール内の非モジュラーヘッダーを許可するオプションを削除することは容易に想像できます。
Ben Leggiero

170

ヘッダーファイルがフレームワークのパブリックヘッダーの一部として公開されていることを確認してください。

Goto Framework-> Target-> Build Phasesとドラッグして、関連するヘッダーファイルをProjectからPublicに移動します。お役に立てば幸いです。

スクリーンショット


3
おかげで、Objective CコードをSwiftフレームワークに組み込むことができました。
Vadim

1
XCodeのメイン画面の右側にある[ファイルインスペクタ]ウィンドウを使用して、ファイルのプロジェクトからパブリックにターゲットメンバーシップを変更することもできます。
Pigpocket

ライブラリをswift / objcの組み合わせにインポートする場合は、ブリッジングヘッダーもパブリックであることを確認する必要があります。間違えた!
Nick H247

74

あなたは、設定することができます非モジュラーフレームワークモジュールに含まれる許可 YESに影響を受けたターゲットのビルド設定に。これは、編集する必要があるビルド設定です。

編集する必要があるビルド設定項目

:この機能を使用して、根本的なエラーを発見する必要があります。このエラーは、いくつかの依存関係があるファイルに山括弧で囲まれたグローバルインクルードが重複していることが原因であることがよくあります。

#import <Foo/Bar.h> // referred to in two or more dependent files

設定が場合は非モジュラーフレームモジュールに含まれる許可YESとのセットで結果エラーや並べ替えの何か「Xがあいまいな参照である」、あなたは問題の重複(複数可)を追跡し、それらを排除することができるはずです。コードをクリーンアップしたら、[フレームモジュール内の非モジュール式インクルードを許可]を[ いいえ]に戻します。


1
OK、問題の原因となった山かっこでした。CocoaPodsインポートでこの問題が発生し、山括弧の代わりに引用符を使用するようにインポートを変更することで修正しました。
Michael Forrest

エラーが発生しました。プロジェクトをクリーンアップした後、壊れていたことがわかりました:-/
Michael Forrest

2
「あいまいな参照」の警告はまったく見つかりません。YESに設定したままにすることの欠点は何ですか?
Nicolas Miari

28

同じ問題があり、ヘッダーファイルを公開するだけで解決しました。 [問題]

プロジェクトの複数のモジュールで作業している場合。次に、プロジェクトの他の部分で使用するために、ヘッダーファイルを公開する必要があります。必要なのは、そのヘッダーファイルを選択し、プロジェクトのユーティリティビューで表示することです。ファイルをProject / PrivateからPublicに変更します。下の画像を参照してください。

ヘッダーファイルのスコープの変更


これは特に、既存のパブリックヘッダーを複製すると、複製されたヘッダーメンバーシップが「プロジェクト」に変更されます
Jeremie

いいえ、それは複製に関して強制ではありません。たとえば、プロジェクトをライブラリとしてプロジェクトに完全にインポートし、プライベートクラスを変更しようとした場合など、さまざまなケースが原因で発生する可能性があります。あなたはヘッダーファイルを知っていてそれを書きますが、アクセスはすべてのプロジェクトに公開されていません。
2017年

23

「フレームワークモジュール内の非モジュールヘッダーの組み込み」

このエラーが発生した場合、状況によっては、インポートしようとしているファイルをファイルインスペクターの「ターゲットメンバーシップ」で「パブリック」としてマークするという解決策が考えられます。デフォルトは「プロジェクト」です。このように設定すると、このエラーが発生する可能性があります。たとえば、Google Analyticのヘッダーをフレームワークにインポートしようとしたとき、私はそうでした。


この答えは、私の同じような問題で私を大いに助けました。フレームワークヘッダーファイルをターゲットに追加できることを知りませんでした。アプリケーションプロジェクトでは、ヘッダーがターゲットの一部になることはありません。
バイオ

20

実際には、これを修正する簡単な方法は、#importステートメントを.m.hヘッダーファイルに含めるのではなく)ファイルの先頭に移動することです。これにより、モジュール化されていないヘッダーファイルが含まれていることに不満が出なくなります。私はこの問題持っていたAllow non-module includesように設定YESしなかったしないので、実装ファイルにそれを移動することで、私のために仕事を、それは文句を停止しました。とにかく、これはヘッダーファイルをインポートしてインクルードするための好ましい方法です。これを実行したら、これをに戻す設定NOが機能するはずです。

理想的には、にAllow non-module includes設定することを目指しNOます。YESほとんどの場合、これをに設定すると、何か問題が発生しています。この設定は、「他の方法ではモジュールの一部ではない、ディスク上のランダムなヘッダーファイルのインポートを許可する」に変換されます。これは実際にはごく一部のユースケースに適用されるため、この設定は常にNO(デフォルト値)である必要があります。


10

独自のフレームワークを開発している場合:

なぜこうなった?

あなたに言及している公共のヘッダファイルのいずれかの場合module.modulemapがされているimport文持たない modulemapに言及し、これはあなたにエラーが発生します。(module.modulemapで)モジュールとして宣言されていないヘッダーをインポートしようとするため、フレームワークのモジュール性が損なわれます。

どうすれば修正できますか?

エラーを発生させたヘッダーをmodule.modulemapに含めて、もう一度ビルドしてください!

なぜ単に非モジュラーをYESに設定しないのですか?

ここでは実際には解決策ではないため、プロジェクトにこのフレームワークはモジュール化されるはずでしたが、そうではありません。どうにかして使用してください。私は気にしません。」これはライブラリのモジュール性の問題を修正しません。

詳細については、このブログ投稿を確認するか、clang docsを参照してください。


どのようにしてCocoaプロジェクトフレームワークでmodule.modulemapを設定しましたか?私は自分のライブラリをSwift専用プロジェクトで動作できるようにしようとしましたが、ライブラリの依存関係の1つであるmodule.modulemapが機能していないため、cocoapodはモジュールマップの自動生成は機能しないようですが、似たような問題に直面しましたか?
Amadeu Cavalcante Filho

8

CocoaPodsターゲットにこれが必要な場合は、Podfile次の行を追加します。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end

7

Allow Non-modular Includes in Framework Modulesobjcコードでのみ機能します。迅速に動作しません。

しばらく調査した結果、swiftは警告パラメーターをclangに渡すことができるので、swiftインポートエラーOTHER_SWIFT_FLAGS-Xcc -Wno-error=non-modular-include-in-framework-module禁止するように設定しました。

同じ問題を抱えている人のためだけに


6

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

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

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

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

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


6

同じ問題がcrazy.finallyになり、インターフェイスの代わりに「import xxx.h」を実装に配置すると問題を解決できることがわかります。そして、Cocoapodsを使用してプロジェクトを管理する場合は、追加できます

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES'}

'xxx.podspec'ファイル内。


6

動的フレームワークを構築するときに、アンブレラヘッダーにこのエラーが表示される場合は、ファイルを次のようにインポートしてください。

#import "MyFile.h"

としてではなく#import <MyFramework/MyFile.h>


2

私もこの問題に遭遇し、最初はCocoaPodsの問題だと思っていましたが、誰か(おそらく私)が${PODS_ROOT}ヘッダー検索パスに設定し、それを検索に設定していたアプリのビルド設定の問題でしたrecursive。これにより、アプリのビルド時に使用することを目的としていないヘッダーを見つけることができました。これを使用するように設定すると、non-recursiveすべてが問題なく動作しました。recursive検索の使用は、適切なヘッダーを見つけようとする恐ろしいハックです。学んだ教訓。


これも私の問題であることが確認できます。
WilsonMuñoz19年

PersonalizedAdConsentでこの問題が発生し、これで修正されました。ありがとう!
スティーブンエリオット

1

これは、私にとっては厄介な問題でした。私の個々のファイルヘッダーファイルに「非モジュラー」ヘッダーを含める必要があったため、私の特定のケースに役立つ提案はありませんでした。私が使用した回避策は、プレフィックスヘッダーファイルにインポート呼び出しを貼り付けることでした。


0

上記の解決策を確認した後、アンブレラヘッダーをヘッダーリストの一番下に移動してしまい、Xcode 9.3で動作しました。


0

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

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

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

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



0

@import FrameworkName代わりに試してください#import "FrameworkName.h"


-5

Git cleanを使用して、これらのエラーの数十をクリアすることができました。コマンドは次のとおりです。 git clean -dffx && git reset --hard

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