web-dev-qa-db-ja.com

Swift Framework:Umbrella header '[...]。h' not found

Objective-CSwiftの両方のコードを含むカスタムフレームワークでは、Swiftコンパイラーは次のエラーをスローします。

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'
103
Tim Bodeit

これは、FrameworkターゲットでAlways Search User Paths設定が有効になっている場合に発生します。

Noに設定すると、そのエラーは解決します。

私見これはSwiftコンパイラのバグであり、私はAppleにレーダーを提出しました。
を参照 rdar:// 2103844

25
Tim Bodeit

これは通常、プロジェクトの名前を変更した後などに発生します。問題は、アンブレラヘッダーがPublicヘッダーとしてリストされなくなったことです。これを修正する方法については、添付の画像を確認してください。

Fix

208
arturgrigor

Xcode 7 Betaでは、Swift2で、フレームワークヘッダーが「パブリック」として宣言されていない場合にも発生します

たとえば、Cocoa Touch Frameworkにはヘッダーファイルの "Project"可視性があり、プロジェクト内のすべてのSwiftファイルに対してエラー "Umbrella Header ... not found"がありました。ヘッダー「パブリック」、エラーはなくなりました

43
Claude Houle

Xcodeの以前のバージョンのバグを無視して、これが発生する可能性のある4つの異なる方法があります

  • プロジェクトに$(TARGET_NAME).hという名前のアンブレラヘッダーがありません
  • アンブレラヘッダーはありますが、パブリックとして設定されていません。 arturgrigorの答えを参照
  • DEFINES_MODULEYESに設定されていません
  • CLANG_ENABLE_MODULESYESに設定されていません
37

私にとって-アクセスレベルは公開されていましたが、傘が見つからないため失敗します。 「ビルドフェーズ」の「ヘッダー」セクションを一番上に移動すると、機能し始めました。ポッドファイルへのスクリプト:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

なぜそれが起こっているのか見当もつかない。ダミープロジェクトで試してみました-起こっていません。複数の依存関係を持つ大きなもののみ。アンブレラヘッダーをコピーする前にコンパイルするもの。

18
Aleksei Minaev

フレームワークをパブリックに設定する必要があります。

enter image description here

もう1つの解決策:フォルダーの名前を変更した後、Xcodeのサイドバーを使用して場所を更新した場合でも、古い場所が.hファイルのプロジェクトファイルに表示されることがあります。この古い場所により、アンブレラヘッダーエラーが発生します。

簡単な解決策:.hファイルへの参照を削除して、再度追加します。 (そして、それをもう一度公開することを忘れないでください!)

7
Danra

「ヘッダーマップを使用」を「いいえ」に設定して問題を解決しました

7
xySVerma

ここにはすでにいくつかの優れた答えがあります。 @ Shadow_x99はとても役に立ちました。ただし、自分の経験で補うことができれば。

アンブレラヘッダーは、ビルドプロセスで自動的に識別されます。 ターゲットのビルド設定で指定されていないか、プロジェクト設定から継承されていません。

このエラーを回避するために、-XC​​ode 7の時点-は次のとおりです。

warning: no umbrella header found for target 'MyTarget', module map will not be generated

2つの重要な手順を実行する必要があります。

まず、アンブレラヘッダーにはターゲットと同じ名前が必要です。したがって、ターゲットがMyTargetという名前のフレームワークである場合、MyTarget.hという名前のヘッダーが必要です。

第二に、MyTargetのビルドフェーズで-その答えで述べたように-そのヘッダーファイルは、上記のようにpublicセクションにリストする必要があります。

4
Max MacLeod

New Swift Build SystemとParallelize Buildをオンにすると、この質問のようなエラーが発生することがわかりました。解決策は、Swiftソースファイルにインポートされたフレームワークにリンクすることでした。 (フレームワークがシリアルビルドキューで以前にビルドされたものにリンクされたことがたまたま起こったため、以前はアプリがビルドされたと思います)。

ワークスペース内のすべてのターゲットのすべてのインポートを実行し、それらのフレームワークがそのターゲットにリンクされていることを確認するスクリプトを作成しました。

https://github.com/Jon889/SwiftImportChecker

3
Jonathan.

私は同じ問題を抱えており、提案された回答のいずれも私のケースでは役に立たなかったので、誰かが同じ問題を抱えている場合に備えてここに残します。

「ビルドフェーズ」に「スクリプトの実行」を追加しましたが、最終的にはそれを削除することになり、エラーが発生し始めました。

私のソリューションは、プロジェクトをクリーンアップし、フレームワークを再構築し、アプリプロジェクトを正しくビルドする必要がありました。

1
Ana Figueira

これらのファイルをプロジェクトのディレクトリから削除します。 .xcworkspacepods/およびpodfile.lock

ポッドを更新してプロジェクトをビルドします。

0
Subhash

問題のあるフレームワークのコンパイルモードをIncrementalに設定することで修正しました。

0

ビルドフェーズでヘッダースクリプトを削除することで問題が発生した可能性があります

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

このスクリプトを削除すると、問題が修正されました。

0
phnmnn

Xcode 7.1およびCocoaPods 0.39を使用している場合、一部のCocoaPods(Nimble、Quickなど)に影響するSwiftコンパイラーの変更があるようです。このスレッドで指定されているソリューションのいくつかを試してください。 https://github.com/CocoaPods/CocoaPods/issues/442 ただし、どちらも機能しない場合は、Xcode 7.0.1または7.2ベータ版を使用してみてください。これらは両方とも https://developer.Apple.com/downloads/ で入手できます。

編集:私の場合、問題を修正するために、CocoaPodsを0.38.2にダウングレードする必要がありました。

後の編集:Xcode 7.1とは関係ないようです。 CocoaPodsを0.38.2にダウングレードするだけで次のことが可能になります。

Sudo gem uninstall cocoapods -v 0.39
Sudo gem install cocoapods -v 0.38.2
0
Marius

Module.modulemapの名前をmoduleXYZ.modulemapに変更し、プロジェクト設定のmodulemapファイル名を変更することでこれを解決しました

0
retterdesapok

ヘッダーファイルは[Build Phases/Headers/Public]セクションにある必要があります。

ヘッダーファイルが既に[Build Phases/Headers/Public]セクションにある場合、休閑を何度も繰り返すことで問題が解決しました。

  1. プロジェクトをきれいにする
  2. ヘッダーファイルを「プライベート」または「プロジェクト」セクションに移動します
  3. ヘッダーファイルを「パブリック」セクションに戻す
  4. すべてを再構築する
0
Andrei A.

私の経験では、プロジェクトターゲットではなく、エラーを与えているフレームワークをターゲットで選択する必要があります。
次にコンパイルし、コンパイル後にプロジェクトターゲットで使用できるようになります。

0
Eironeia