Objective-CとSwiftの両方のコードを含むカスタムフレームワークでは、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'
これは、FrameworkターゲットでAlways Search User Paths
設定が有効になっている場合に発生します。
No
に設定すると、そのエラーは解決します。
私見これはSwiftコンパイラのバグであり、私はAppleにレーダーを提出しました。
を参照 rdar:// 2103844
Xcode 7 Betaでは、Swift2で、フレームワークヘッダーが「パブリック」として宣言されていない場合にも発生します
たとえば、Cocoa Touch Frameworkにはヘッダーファイルの "Project"可視性があり、プロジェクト内のすべてのSwiftファイルに対してエラー "Umbrella Header ... not found"がありました。ヘッダー「パブリック」、エラーはなくなりました
Xcodeの以前のバージョンのバグを無視して、これが発生する可能性のある4つの異なる方法があります
DEFINES_MODULE
はYES
に設定されていませんCLANG_ENABLE_MODULES
はYES
に設定されていません私にとって-アクセスレベルは公開されていましたが、傘が見つからないため失敗します。 「ビルドフェーズ」の「ヘッダー」セクションを一番上に移動すると、機能し始めました。ポッドファイルへのスクリプト:
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
なぜそれが起こっているのか見当もつかない。ダミープロジェクトで試してみました-起こっていません。複数の依存関係を持つ大きなもののみ。アンブレラヘッダーをコピーする前にコンパイルするもの。
もう1つの解決策:フォルダーの名前を変更した後、Xcodeのサイドバーを使用して場所を更新した場合でも、古い場所が.hファイルのプロジェクトファイルに表示されることがあります。この古い場所により、アンブレラヘッダーエラーが発生します。
簡単な解決策:.hファイルへの参照を削除して、再度追加します。 (そして、それをもう一度公開することを忘れないでください!)
「ヘッダーマップを使用」を「いいえ」に設定して問題を解決しました
ここにはすでにいくつかの優れた答えがあります。 @ Shadow_x99はとても役に立ちました。ただし、自分の経験で補うことができれば。
アンブレラヘッダーは、ビルドプロセスで自動的に識別されます。 ターゲットのビルド設定で指定されていないか、プロジェクト設定から継承されていません。
このエラーを回避するために、-XCode 7の時点-は次のとおりです。
warning: no umbrella header found for target 'MyTarget', module map will not be generated
2つの重要な手順を実行する必要があります。
まず、アンブレラヘッダーにはターゲットと同じ名前が必要です。したがって、ターゲットがMyTarget
という名前のフレームワークである場合、MyTarget.h
という名前のヘッダーが必要です。
第二に、MyTarget
のビルドフェーズで-その答えで述べたように-そのヘッダーファイルは、上記のようにpublicセクションにリストする必要があります。
New Swift Build SystemとParallelize Buildをオンにすると、この質問のようなエラーが発生することがわかりました。解決策は、Swiftソースファイルにインポートされたフレームワークにリンクすることでした。 (フレームワークがシリアルビルドキューで以前にビルドされたものにリンクされたことがたまたま起こったため、以前はアプリがビルドされたと思います)。
ワークスペース内のすべてのターゲットのすべてのインポートを実行し、それらのフレームワークがそのターゲットにリンクされていることを確認するスクリプトを作成しました。
私は同じ問題を抱えており、提案された回答のいずれも私のケースでは役に立たなかったので、誰かが同じ問題を抱えている場合に備えてここに残します。
「ビルドフェーズ」に「スクリプトの実行」を追加しましたが、最終的にはそれを削除することになり、エラーが発生し始めました。
私のソリューションは、プロジェクトをクリーンアップし、フレームワークを再構築し、アプリプロジェクトを正しくビルドする必要がありました。
これらのファイルをプロジェクトのディレクトリから削除します。 .xcworkspace
pods/
およびpodfile.lock
ポッドを更新してプロジェクトをビルドします。
問題のあるフレームワークのコンパイルモードをIncrementalに設定することで修正しました。
ビルドフェーズでヘッダースクリプトを削除することで問題が発生した可能性があります
function removeHeaders() {
find $BUILD_ROOT/... -name '*.h' -exec rm -f {} \;
}
removeHeaders
このスクリプトを削除すると、問題が修正されました。
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
Module.modulemapの名前をmoduleXYZ.modulemapに変更し、プロジェクト設定のmodulemapファイル名を変更することでこれを解決しました
ヘッダーファイルは[Build Phases/Headers/Public]セクションにある必要があります。
ヘッダーファイルが既に[Build Phases/Headers/Public]セクションにある場合、休閑を何度も繰り返すことで問題が解決しました。
私の経験では、プロジェクトターゲットではなく、エラーを与えているフレームワークをターゲットで選択する必要があります。
次にコンパイルし、コンパイル後にプロジェクトターゲットで使用できるようになります。