XCode是macOS上開(kāi)發(fā)app不可缺少的開(kāi)發(fā)者工具,不管是開(kāi)發(fā)macOS上的應(yīng)用,還是iOS上的應(yīng)用,都離不開(kāi)XCode環(huán)境。盡管其易用性廣受詬病,但由于蘋(píng)果app開(kāi)發(fā)的封閉性,眾多開(kāi)發(fā)者也不有苦不能言。近年來(lái)微軟針對(duì)macOS平臺(tái)發(fā)布了Visual Studio Code和Visual Studio for Mac這兩款開(kāi)發(fā)工具,但是其目的顯然只是作為XCode的一種補(bǔ)充,要全盤(pán)替代XCode目前還不太現(xiàn)實(shí)。平時(shí)工作中由于負(fù)責(zé)開(kāi)發(fā)維護(hù)Windows和Mac兩個(gè)平臺(tái)的應(yīng)用,因此常常需要用到XCode。但由于macOS系統(tǒng)本來(lái)就比較逆反,用慣了Winodws陡然切換到macOS,根本無(wú)所適從。對(duì)于XCode的使用更是如此。在此記錄下平時(shí)開(kāi)發(fā)過(guò)程中經(jīng)常用的操作,以免自己再次切換到macOS上時(shí)一臉懵逼。
1. Install name and Runpath
install name是個(gè)什么玩意兒?簡(jiǎn)單的說(shuō),是便于加載器dyld找到程序鏈接的庫(kù)文件。一般情況下dyld在加載程序的時(shí)候,會(huì)去一些固定的路徑(如/usr/local/lib, /usr/lib)下尋找需要的庫(kù)文件。如果沒(méi)有找到庫(kù)文件,程序就會(huì)加載失敗并報(bào)錯(cuò)。install name的出現(xiàn)就是為了解決這種問(wèn)題,允許用戶把庫(kù)文件放到其他位置,通過(guò)install name告訴dylb到哪去尋找這個(gè)庫(kù)文件。
在XCode中用好install name需要設(shè)置兩個(gè)地方:
(1)Build Settings->Linking,設(shè)置了Dynamic Library Install Name和Dynamic Library Install Name Base兩項(xiàng)。這里用到了@rpath變量,其含義和用法在前面的博客中有細(xì)說(shuō)過(guò)。@rpath其實(shí)是“runpath”的縮寫(xiě),其值在第二步中設(shè)置。
(2)Build Settings->Runpath Search Paths,設(shè)置了runpath的搜索路徑。在這一項(xiàng)里面可以設(shè)置多個(gè)路徑。這里設(shè)置的每個(gè)項(xiàng)都會(huì)替換@rpath,從而達(dá)到靈活設(shè)置多個(gè)位置的目的??梢栽谙聢D中看到,我們使用了@loader_path這個(gè)變量,其值實(shí)際上是可執(zhí)行程序的所在位置。因此,假設(shè)可執(zhí)行程序所在路徑為:/Users/zhangzhongke/Library/bin/test,@loader_path/../Resources”把上面設(shè)置的@rpath替換了之后就變成了:/Users/zhangzhongke/Library/bin/test/../Resources,實(shí)際也就是:/Users/zhangzhongke/Library/Resources/。我們這里runpath只設(shè)置了一個(gè)值,實(shí)際上有需要可以設(shè)置多個(gè)值。
通過(guò)命令otool -L可查看dylib文件的install name確實(shí)已經(jīng)設(shè)置成了我們