xcode 配置文件*.xcconfig
Configuration Settings File文件,后綴名為*.xcconfig
可以設(shè)定多個環(huán)境自匹配debug模式和release模式解孙,eg: debug.xcconfig release.xcconofig
如何新增變量:
在*.xxconfig文件中添加:GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1 COCOAPODS=1 PRODUCT_WALLET=1 MARK_POINT_INFO=@\"46000221\"
指令集Architectures 配置
處理器:中央處理器
程序編譯后,要調(diào)用處理器能識別的指令來完成我們設(shè)定程序要做的任務(wù)裆泳。這些指令必須是處理器能夠識別并能夠執(zhí)行的。這就引出了兩個元素懦趋,處理器和處理器對應(yīng)的指令集合。比如 ARM 處理器 疹味,指令集合比如 arm7 , arm7s, arm64等等仅叫。
真機(jī)指令集:
模擬器指令集
Architectures:
包含的指令集
Excluded Architectures
xcode 12 新增功能,要排除掉的指令集糙捺,一般模擬器中去掉 arm指令集 可以在*.xcconfig中設(shè)定:EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
Other Linker Flags
ios工程的編譯過程:源代碼 > 預(yù)處理器 > 編譯器 > 匯編器 > 機(jī)器碼 > 鏈接器 > 可執(zhí)行文件
問題:Objective-C的鏈接器并不會為每個方法建立符號表诫咱,而是僅僅為類建立了符號表。這樣的話洪灯,如果靜態(tài)庫中定義了已存在的一個類的分類坎缭,鏈接器就會以為這個類已經(jīng)存在,不會把分類和核心類的代碼合起來签钩。這樣的話掏呼,在最后的可執(zhí)行文件中,就會缺少分類里的代碼铅檩,這樣函數(shù)調(diào)用就失敗了憎夷。
解決方法:other linker flags添加
-ObjC 鏈接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中
-all_load或者-force_load :如果文件只有分類,沒有類昧旨,-ObjC不起作用拾给,此時使用-all_load(不常用,如果有兩個類同名可能會有duplicate symbol錯誤)
Debug Information Format
xcode 配置文件 Build Settings -> Build Options -> Debug Information Format? 中設(shè)置
DWARF:不會產(chǎn)生dSYM符號表文件
DWARF with dSYM File會產(chǎn)生dSYM符號表文件
$(inherited)
一般用于配置Frameworker Search Paths兔沃,Header Search Paths等蒋得,$(inherited) 代表Target中的配置繼承上面project默認(rèn)的配置
Podfile文件配置
ios中 .h文件即頭文件,無論是framework(動態(tài)庫)方式還是.a(靜態(tài)庫)方式乒疏,都會有頭文件
使用use_frameworks!
使用cocoapods管理項目時额衙,Podfile文件中聲明use_frameworks! 表示使用第三方庫導(dǎo)入工程會使用framework方式,一般swift工程或者混合工程使用
工程中導(dǎo)入類方式: #import "<XXX/XXX.h>"
不使用use_frameworks!
工程中導(dǎo)入第三方庫會使用xxxlib.a方式
工程中導(dǎo)入類方式: #import "XXX.h"
原因分析:
xcode制作動態(tài)庫和靜態(tài)庫
xcode早期常用.a靜態(tài)庫方式怕吴,必須要配置 Header Search Path頭文件入偷,頭文件配合,a文件使用,而且在鏈接時會copy .a靜態(tài)庫代碼到app的可執(zhí)行文件中械哟,而且隨著.a文件被使用次數(shù)的增加疏之,整個app提交也會增加,制作靜態(tài)庫時暇咆,Mach-O Type選擇 Static Library
后面xcode推出了framework方式锋爪,framework可以制作動態(tài)庫丙曙,也可以制作靜態(tài)庫,區(qū)別在于Mach-O Type的設(shè)置其骄,經(jīng)過實驗發(fā)現(xiàn)亏镰,無論是靜態(tài)庫還是動態(tài)庫,xcode相當(dāng)于進(jìn)行了簡化:
1)使用framework方式的庫包拯爽,可以不用設(shè)置Header Search Path頭文件索抓,但是必須指定framework search path
2)使用framework打的靜態(tài)包(Mach-O Type配置成 Static Library)可以指定Embed 也可以指定 do not Embed(代表framwork嵌入到app可執(zhí)行代碼中)
3)使用framework打的動態(tài)包,必須是 embed(代表framwork嵌入到app資源包中毯炮,app運行使用的時候逼肯,動態(tài)鏈接)
4)和.a文件不同的是,由于沒有配置頭文件桃煎,在使用的時候需要指定framwork 例如? #import "<XXX/XXX.h>"
cocoapods 和carthage區(qū)別:
carthage導(dǎo)入framework篮幢,swift項目的包管理,只編譯一次
cocoapods每次都會編譯
http://www.cloudchou.com/ios/post-990.html
xcode多工程聯(lián)編
1)使用xxx.xcworkspace只是多個xxx.xcodeproj的捆綁为迈,并沒有其他設(shè)置
2)xcode有個很有趣的特性三椿,至今未搞懂:(多個子工程聯(lián)編的時,主工程會自動編譯子工程)
test1為主工程葫辐,test2為子工程搜锰,test2一般是我們創(chuàng)建的 framwork sdk,在test1的xcode配置中引入test2.framwork后耿战,如果test.framwork對應(yīng)的工程源碼和test1在同一個xcworkspace下纽乱,編譯主工程時,會自動聯(lián)編譯test2子工程昆箕,也就是test2可以斷點調(diào)試鸦列,這也是為什么pods的工程每次都是重新編譯三方庫,而carthage不會鹏倘,carthage沒有中央管理的概念薯嗤,引入每個三方庫都只是是引入三方庫自己的framwork而且沒有引入源碼