轉(zhuǎn)自:https://blog.csdn.net/blog_jihq/article/details/52614156
/Users/jifeng/Library/Developer/Xcode/DerivedData/App-dpxkmrruvfndhjfuqdoultvoaiad/Build/Products/Release-iphonesimulator/ServyouCocoaPodDynamicLayout/ServyouCocoaPodDynamicLayout.framework/Headers/SVDynamicLayoutManager.h:9:9: error: include of non-modular header inside framework module 'ServyouCocoaPodDynamicLayout.SVDynamicLayoutManager' [-Werror,-Wnon-modular-include-in-framework-module] \#import "SVObject.h" ^ 1 error generated. /var/folders/rg/f1ycrs553dq2z2dq7mt0mbh80000gn/T/CocoaPods/Lint/App/main.m:3:9: fatal error: could not build module 'ServyouCocoaPodDynamicLayout' @import ServyouCocoaPodDynamicLayout;
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
遇到這個(gè)問(wèn)題之后在網(wǎng)上搜索了下“include of non-modular header inside framework module”,網(wǎng)上大部分的解決方法是:將Build Settings中的Allow Non-modular Includes In Framework Modules設(shè)為YES嫂易,但一直沒(méi)有講出現(xiàn)問(wèn)題的原因。
后來(lái)看到了一個(gè)簡(jiǎn)書(shū)的文章,簡(jiǎn)單說(shuō)明了問(wèn)題原因,并且提供了另一個(gè)解決辦法:http://www.reibang.com/p/a1d2d148fdd3
簡(jiǎn)單來(lái)說(shuō)就是在podfile文件中寫(xiě)代碼,動(dòng)態(tài)地生成modulemap和umbrella文件。
最終感覺(jué)第二種解決方法有些取巧厅缺,怕以后出現(xiàn)問(wèn)題罢吃,還是決定采用第一種方法楚午。
首先通過(guò)lint命令的--no-clean參數(shù)查看編譯工程,手動(dòng)修改了第一個(gè)解決方法中提及的編譯開(kāi)關(guān)尿招,改為YES后確實(shí)沒(méi)有了問(wèn)題矾柜。
但是創(chuàng)建一個(gè)pod顯然不能手動(dòng)的修改該設(shè)置,于是在官方的podspec語(yǔ)法介紹網(wǎng)頁(yè)https://guides.cocoapods.org/syntax/podspec.html中查看就谜,最終在build settings找到了三個(gè)可能相關(guān)的參數(shù):compiler_flags怪蔑、pod_target_xcconfig、user_target_xcconfig丧荐。
首先嘗試配置compiler\flags缆瓣。因?yàn)榭吹焦俜降睦邮莝pec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
而我的錯(cuò)誤信息中也有類(lèi)似的-Wnon-modular-include-in-framework-module,所以我配置了spec.compiler_flags = '-Wnon-modular-include-in-framework-module'虹统,但是沒(méi)有效果弓坞。
然后嘗試配置pod_target_xcconfig。官方的例子是:spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }车荔。這應(yīng)該是對(duì)應(yīng)的Build Settings里面的Other Link Flags設(shè)置渡冻。雖然明知道很可能是錯(cuò)誤的,但我還是嘗試設(shè)置成spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-Wnon-modular-include-in-framework-module' }夸赫。果然無(wú)效菩帝。配置中{}應(yīng)該是字典類(lèi)型的配置,=>之前的字符串是一個(gè)key值茬腿,現(xiàn)在需要先找到Allow Non-modular Includes In Framework Modules設(shè)置對(duì)應(yīng)的key值呼奢。在Xcode的Quick Help中看到注釋中Declaration CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES,嘗試了一下spec.pod_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }切平,發(fā)現(xiàn)沒(méi)有效果握础。后來(lái)想到Xcode是可以通過(guò)命令行進(jìn)行編譯的,編譯指令中可能會(huì)有對(duì)應(yīng)的key值悴品。然后雖然沒(méi)有直接找到對(duì)應(yīng)的key值禀综,但是看到了xcodebuild有-showBuildSettings參數(shù)可以查看編譯設(shè)置。所以就先手動(dòng)將編譯工程中的Allow Non-modular Includes In Framework Modules設(shè)成YES苔严。然后通過(guò)xcodebuild -workspace App.workspace -scheme App -showBuildSettings查看了當(dāng)前工程所有的設(shè)置定枷,果然發(fā)現(xiàn)了這樣一個(gè)常量CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES的值為YES。Quick Help中的聲明是對(duì)的key值届氢,但pod_target_xcconfig的配置不起作用欠窒。
最后嘗試配置user_target_xcconfig,按照官方的例子退子,
配置為:spec.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }岖妄。成功型将,lint命令只剩下warning。
不過(guò)看官方的解釋荐虐,user_target_xcconfig和pod_target_xcconfig的區(qū)別在于user_target_xcconfig是對(duì)于編譯工程中所有pod的設(shè)置七兜,而pod_target_xcconfig只是針對(duì)當(dāng)前pod的。所以如果多個(gè)pod的podspec中對(duì)user_target_xcconfig同一個(gè)值進(jìn)行了設(shè)置福扬,那么就可能存在沖突問(wèn)題腕铸。但因?yàn)镃LANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES在pod_target_xcconfig不起作用,只能按現(xiàn)在的配置來(lái)處理忧换。
8. 將私有倉(cāng)庫(kù)拉到本地時(shí)可能會(huì)存在兩個(gè)恬惯。
因?yàn)間it存在兩個(gè)地址,分別是git和http/https亚茬,所以有時(shí)候可能會(huì)在本地repos下出現(xiàn)兩個(gè)基于同一個(gè)git的倉(cāng)庫(kù),倉(cāng)庫(kù)名字不同浓恳。因?yàn)橐婚_(kāi)始Lint的時(shí)候是指定了倉(cāng)庫(kù)名的刹缝,所以能通過(guò),但pod repo push的時(shí)候雖然指定了push的倉(cāng)庫(kù)名颈将,但因?yàn)闆](méi)有指定校驗(yàn)的倉(cāng)庫(kù)名梢夯,一旦你的pod依賴了私有倉(cāng)庫(kù)中的某個(gè)pod,校驗(yàn)時(shí)會(huì)出現(xiàn)類(lèi)似[!] Found multiple specifications forSVLibrary (2.2.0)`:的錯(cuò)誤晴圾。此時(shí)需要?jiǎng)h除掉一個(gè)私有倉(cāng)庫(kù)颂砸,然后重新push才行。