2015-05-20 23 views
67

在同時含有目標C夫特碼的定製的框架,所述編譯器斯威夫特引發以下錯誤:夫特框架:傘頭「 [...] H」沒有找到

[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' 

回答

25

當爲Framework目標啓用Always Search User Paths設置時,會發生這種情況。

將其設置爲No將解決該錯誤。

恕我直言,這是Swift編譯器中的一個錯誤,我已經向蘋果提交了一個雷達。
rdar://21038443

+1

謝謝!這也是我得到的。 –

+11

沒有爲我工作 – malhal

+2

礦已被設置爲否,所以沒有解決任何問題。 :( –

40

在Xcode 7測試版,與Swift2,它也將發生,如果你的框架頭不爲「公共」

例如宣佈,我有一個可可觸摸框架與「項目」的知名度對於我的項目中的所有swift文件,頭文件和錯誤「Umbrella Header ... not found」一旦我的頭部爲「Public」,錯誤就消失了

+1

就我而言,當我遇到這個問題時,這個答案看起來像是「更正確」的答案, – greymouser

+1

我同意這是正確答案請檢查.h文件是否具有正確的目標成員和訪問級別(公共) – user965972

+0

@ Shadow_x99如何將標題設置爲「Public」,我的問題發佈在http://stackoverflow.com/questions/36084291/no-umbrella-header-found-for-target?noredirect=1#comment59813773_36084291 – user2727195

5

對於我設置'Use Header Maps'到「否」解決了問題

+0

...在我的情況下,將其設置爲YES解決了問題。不幸的是,似乎沒有是關於這個設置的任何文檔,但是是默認的,我不確定爲什麼它被設置爲我的目標之一。 – robotspacer

0

如果您使用Xcode 7.1和CocoaPods 0.39,似乎有一個迅速的編譯器變化,影響了一些CocoaPods(Nimble,Quick等)。嘗試一些在此線程中指定的解決方案:https://github.com/CocoaPods/CocoaPods/issues/4420但是,如果它們都不工作,請嘗試使用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 Ursache。遵循你的指示爲我解決了這個問題。 –

152

這通常發生在項目重命名或類似的事情之後。問題是,傘頭不再列爲Public標頭。檢查附加的圖像,看看如何解決這個問題。

Fix

+4

給未來的讀者一個提示,看到'Build Phases'的'Headers'部分,你需要點擊一個Pod目標。主應用目標不會列出'標題'部分。 – shmim

+3

這完全解決了它。謝謝。這應該是被批准的答案。 – Gujamin

+5

對我來說 - 訪問級別是公開的,但它也沒有找到傘。 我確實將「構建階段」的「標題」部分移到頂部,並開始工作。 –

-1

你的頭文件需要在[構建階段/頭/公共]部分。

如果你的頭文件已經在[構建階段/頭/公共]節,多次做休耕解決我的問題:

  1. 清潔項目
  2. 移動的頭文件到「私人」或‘項目’部分
  3. 動頭文件回‘公共’部分
  4. 重建再次一切
11

對我來說 - 訪問級別是公開的,但也沒有找到傘。我確實將「構建階段」的「標題」部分移到頂部,並開始工作。 腳本podfile:

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 

不知道爲什麼它正在發生。嘗試虛擬項目 - 沒有發生。只在具有多個依賴關係的大個子上。 複製傘頭之前編譯的東西。

+3

移動「頭文件」上方的「編譯源」爲我工作。 xCode 8.2.1。 –

+0

將標題階段移到頂端也適用於我。 –

+0

這是什麼解決了我的問題。謝謝 ! – Ralph

-1

9個答案中沒有一個對我有幫助,所以我試圖創建一個新的項目,我可以發送給蘋果提交一個錯誤。我很驚訝我無法重現這個問題。我檢查了構建設置,它們是等效的。顯然這是一種錯誤。

如果沒有別的幫助,嘗試從當前項目創建一個新項目並導入至少一些目標C &斯威夫特類,從新建項目比較你的架構相關的構建設置爲默認值,並最終將所有文件移至新項目。

3

這裏已經有一些很好的答案。 @ Shadow_x99是非常有幫助的。但是,如果我可以被允許補充我自己的經驗。

傘頭在構建過程中自動識別。 它不是在目標的構建設置中指定的或從項目設置繼承的。

所以爲了避免這個錯誤 - 截至XCode 7 - 如下;必須採取

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

兩個重要步驟。

首先,傘頭必須有與目標同名。因此,如果您的目標是名爲MyTarget的框架,則必須有一個名爲MyTarget.h的標頭。

其次,在MyTarget的構建階段 - 如答案中所述 - 該頭文件必須列在公共部分中,如上所述。

5

另一個解決方案:重命名文件夾後,即使您通過Xcode的側欄更新位置,舊位置仍可能會列在.h文件的項目文件中。這個舊位置會導致傘頭錯誤。

簡單的解決方案:刪除對.h文件的引用,然後重新添加。 (然後記得要重新把它公開!)

26

有4種不同的方式會發生這種情況,在Xcode

  • 的早期版本忽略的錯誤你沒有傘頭名爲$(TARGET_NAME)。 h在您的項目中
  • 您有一個傘頭,但它沒有設置爲公共。See arturgrigor's answer
  • DEFINES_MODULE沒有被設置爲YES
  • CLANG_ENABLE_MODULES未設置爲YES
+0

DEFINES_MODULE =是的,爲我工作 – milanpanchal

5

當然,你必須給你的框架設置爲公開:

enter image description here

-1

我已經工作它一整天,但它是值得的。我嘗試了所有的方式here,,但我沒有解決它。我創建了一個新的項目,一個實驗,我發現了用戶頭搜索路徑被設置好的$ {SRCROOT}遞歸,我把它改成$ {SRCROOT}非遞歸,改變了橋接報頭路(例如#import "SVProgressHUD.h" - >#import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"),錯誤消失。