web-dev-qa-db-ja.com

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

今私は私のObjCフレームワークをSwiftに移行したいと思います、そして私は次のエラーを得ました:

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

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

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

更新:

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

アップデート2:

簡単な解決策(根本的な原因は解決しない)は、次の設定をyesに設定することです。CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES

196
Stephan

あなたのヘッダは公開されていますか?

プロジェクトエクスプローラでヘッダファイルを選択します。次に、xcodeの右側のセクションで、ターゲットの横にドロップダウンがあることに気付くでしょう。それを "project"から "public"に変更してください。これは私のために働きました。

public header

297
kgreenek

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

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では

122
ambientlight

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

私にとっての解決策は、続行することでしたターゲット - >ビルド設定 - >非モジュラーインクルードを許可フレームワークモジュールでYESに切り替えます!

29
Vlad Burlaciuc

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

15
King-Wizard

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

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

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

15
Jimmy Dee

この答えは時代遅れです。

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

enter image description here

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

5
seo

ヘッダファイルはターゲットに割り当てられていましたが、プロジェクト可視としてマークされていただけで、publicへの変更はこのエラーの解決につながりました。

3
Stephan

しない

#import "MyOtherFramework.h"

する

#import <MyOtherFramework/MyOtherFramework.h>
3
hfossli

私はこれが古い質問であることを知っています、しかし私は同じ問題を抱えていて、上から何も助けになりませんでした。だから私は私の答えが誰かに役立つことを願っています。私の場合、問題はALWAYS_SEARCH_USER_PATHS設定にありました。それがNOプロジェクトに設定されていて、うまく動いたとき。しかし、ポッドの1つがYESに設定されることを要求している限り、エラーを受け取りました。

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

数杯のコーヒーと終日の調査の後、私は Xcode 7.1 Beta 2リリースノートの既知の問題 に従って、次のことを発見しました。

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

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

2
iyuna

私もこの問題に関する私の経験を加えたいと思います。

要約すると:

  • @ ambientlightの答えはとても良いもので、ほとんどの問題を解決します。
  • 非モジュラーヘッダを許可することは別の解決策です(上記の回答のいくつかを参照してください)。
  • フレームワークのヘッダを公開(あなたが公開したいものだけ)としてマークし、それらをアンブレラヘッダにインポートする。

これが上記の答えに対する私の2つの追加です。

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

私はこれを最後に試しましたが、今のところこの問題はもう経験していませんが、この解決策はあなたがいくつかのトップの答えを適用した場合にのみ有効であると思います。 、モジュールアプローチおよび非モジュラーヘッダの許可には、が含まれます。

2

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

1
Mohamed TAIEB

プロジェクトに自分のフレームワークを含めるとき、私はこの正確な問題を抱えていました。 sqlite3.hのすべてのインポートを.hファイルではなく.mファイルに入れることで修正されました。私は他のライブラリがXcodeに関する同様の問題にフラグを立てるかもしれないと思います。

1
Rob Sanders

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

1
DevB2F

私はFacebook 4.02 sdkとFBSDKCoreKitに関して特別な問題を抱えていました。

すべての手順を実行しましたが、それでも非モジュールヘッダーについてはエラーになります。フレームワークから特定のヘッダーのみをドラッグアンドドロップして、phase-> headerセクションを構築します。

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

私はそれをビルドフェーズ - >ヘッダーから取り除き、そして新しいファイルを削除し、そしてうまく働きました。

それがリセットされたか何かのように。

1
Haris

ほとんどの場合、このエラーは選択した回答が原因ですが、フレームワークファイルを新しいプロジェクトフォルダーにドラッグしたときに、このエラーが偶然に1回表示されることがありました。私はフレームワークを削除するためにクリックしましたが、実際にファイルを完全に削除するのではなく、誤ってフレームワークへの '参照の削除'だけを押しました。この時点でプロジェクトフォルダをFinderで開くと、 'CoreLocation'や 'AudioToolbox'のようなファイルがあります。プロジェクトフォルダからこれらのファイルを削除し、プロジェクトを消去すると問題が解決しました。

0
ColossalChris

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

#import <YandexMobileMetrica/YandexMobileMetrica.h>
0
Yuri Korshev

私の場合(Xcode 9 Beta 6 - Swift 4 - Cocoapodsを使用)、Podfile.lockPodsディレクトリを削除してpod installを再度実行すると解決しました

0
m_katsifarakis

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

  • Finderを使用して、Appプロジェクトに存在するフレームワークの場所を参照してください。

  • Test.frameworkフォルダの中に入って(上記の場合はSOGraphDB.frameworkになります)、Modulesname__フォルダを削除します。

  • クリーンと再アプリを構築し、それは問題を解決します。

0
Vittal Pai