2015-01-05 105 views
92

我正在使用Xcode 6,在框架模塊中包含非模塊化頭文件

1)首先我要創建一個動態庫(CoreLibrary)。該庫包含RequestPoster.h文件。

2)然後我創建一個Cocoa Touch框架並添加了這個動態庫(CoreLibrary)。

3)然後,這個框架被添加到我的項目,它給RequestPoster.h文件(CoreLibrary)中的錯誤。

錯誤:包括非模塊化頭的框架模塊內部 類:

ifaddrs.h,ARPA/inet.h,SYS/types.h中>

在項目未發現這些文件。

回答

134

嘗試使用「目標」下的「生成設置」並將「允許非模塊化包含在框架模塊中」設置爲YES。

真正的答案是庫的所有者需要更改導入的位置。這些文件ifaddrs.h,arpa/inet.h,sys/types.h被導入到一個框架中的.h文件中,Xcode不喜歡。圖書館維護人員應將其移至.m文件。見例如在GitHub上,其中AFNetworking固定同樣的問題,這個問題:https://github.com/AFNetworking/AFNetworking/issues/2205

+13

這個答案應該標記爲 –

62

您可以設置允許非模塊化包括框架模塊在受影響的目標是構建設置。這是構建設置你需要編輯:

Build Settings item you need to edit

注意:你應該使用此功能,以便露出下面的錯誤,我已經找到了經常由尖括號全球包括重複造成的在一些相關的關係,即文件:

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

如果設置允許非模塊化的框架模塊包括YES導致一組「X是一個模棱兩可的參考」錯誤或類似的東西,你應該能夠追查有問題的副本並消除它們。清理完代碼後,請設置允許非模塊化包含在框架模塊中返回到

+0

好的,這是導致問題的尖括號!我有一個CocoaPods導入的問題,並通過更改導入來使用引號而不是尖括號來修復它。 –

+0

糟糕,不,它沒有。發現它在我清理了我的項目後被破壞了: -/ –

+2

我無法找到任何「模棱兩可的參考」警告。將它設置爲** YES **有什麼缺點? –

11

實際上,解決此問題的更簡單的方法是將#import語句改爲移至.m文件的頂部(而不是在您的.h頭文件中)。這樣它就不會抱怨它包含一個非模塊化的頭文件。我有這個問題Allow non-module includes設置爲YES確實不是爲我工作,所以通過將其移動到實施文件,它停止抱怨。這實際上是導入和包含頭文件的首選方式。

8

「框架模塊內的非模塊化標題包括」當你得到這個錯誤,在某些情況下,該解決方案可以是簡單地標記你想導入爲「公共」文件中的文件督察員「目標會員」。默認值是「Project」,當設置爲這種方式時,可能會導致此錯誤。例如,在嘗試將Google Analytic的標題導入框架時,情況就是如此。

+0

這個答案幫助了我很多類似的問題。我不知道框架頭文件可以添加到目標。在應用程序項目中,標題永遠不是目標的一部分。 – bio

3

我有同樣的問題,上面沒有幫助我。所以我希望我的回答對某人有幫助。在我的情況下,問題在於ALWAYS_SEARCH_USER_PATHS設置。當它被設置爲沒有項目建立和工作正常。但據吊艙的一個要求它被設置爲YES,我收到一個錯誤

包括框架模塊內的非模塊化頭的

的咖啡情侶杯後,整天研究我發現,根據Xcode 7.1 Beta 2 release notes已知問題:

•如果你得到一個錯誤,指出「包括內部 框架模塊非模塊化頭」爲以前編了一個框架,確保 「始終搜索用戶路徑」編譯設置設置爲「否」。由於傳統原因, 默認值爲「是」。 (22784786)

雖然我使用XCode 7.3,但似乎這個bug還沒有被修復。

1

這對我來說是一個討厭的問題。沒有任何建議似乎可以幫助我處理特定情況,因爲我需要在單個文件頭文件中包含「非模塊化」頭文件。我使用的工作是將導入調用粘貼在前綴頭文件中。

59

確保頭文件作爲框架公共標題的一部分公開提供。

轉到框架 - >目標 - >構建階段並拖動將項目中的相關頭文件移動到公共。希望有所幫助!

Screenshot

+0

這幫助我將Objective C代碼包含到Swift框架中,謝謝! – Den

+1

這正是我所需要的。謝謝! – gokeji

+0

這是此問題的正確解決方案 –

16

我有同樣的問題,並通過只是讓頭文件公開解決這個問題。 [problem]

如果您正在處理項目中的多個模塊。然後,您的頭文件需要公開以用於項目的其他部分。您需要的是選擇該頭文件,並在項目實用程序視圖中。將文件從Project/Private更改爲Public。見下圖:

Changing header file scope

+0

這種情況尤其會在您複製現有公用標題時發生,重複的標題成員資格將更改爲「項目「 – Jeremie

+0

不,它不是強制重複的東西。例如,如果將某個項目完全導入到項目中,然後嘗試修改私有類,則可能會出現這種情況。您知道頭文件並編寫它,但訪問權限並未公開給所有項目。 – Saad

1

同樣的問題做出crazy.finally,我覺得把「進口xxx.h」實施的,而不是接口可以解決的問題;如果你使用的CocoaPods來管理你的項目。您可以添加

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

在 'xxx.podspec' 文件

3

如果你需要這個的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 
1

如果你建立一個動態的框架當在傘頭看到此錯誤,請確保您導入文件:

#import "MyFile.h"

#import <MyFramework/MyFile.h>

相關問題