西西軟件下載最安全的下載網(wǎng)站、值得信賴(lài)的軟件下載站!

首頁(yè)業(yè)內(nèi)動(dòng)態(tài) IT人生 → 從vc到xcode、vcer摸索的xcode配置成vc style的方法

從vc到xcode、vcer摸索的xcode配置成vc style的方法

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/12/9 23:22:01字體大小:A-A+

作者:西西點(diǎn)擊:0次評(píng)論:2次標(biāo)簽: xcode

  • 類(lèi)型:電子教程大。1.1M語(yǔ)言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

做windows開(kāi)發(fā)幾年了,一直用vc。感覺(jué)這個(gè)集編輯、調(diào)試、管理于一體的IDE,確實(shí)是組織維護(hù)中小規(guī)模項(xiàng)目的利器。在使用的過(guò)程中,也積累了不少vc經(jīng)驗(yàn)技巧,甚至是習(xí)慣了那整套工作流程。當(dāng)突然換到其它平臺(tái)上開(kāi)發(fā)時(shí),面對(duì)新的系統(tǒng)和工具,總有點(diǎn)格格不入。比如說(shuō)Mac上的xcode,也是一款全功能的IDE,但其在設(shè)計(jì)結(jié)構(gòu)上與vc風(fēng)格頗異,導(dǎo)致vcer在初步接觸的時(shí)候,不是覺(jué)得缺胳膊少腿,就是脫褲子放屁,明明看著就是一漂亮的花瓶,可就是摘不到花瓶里的花朵。但是功夫不負(fù)有心人,或是說(shuō)大道外殊內(nèi)同,終于讓我摸索出一條將xcode配置成vc style的方法,現(xiàn)在在兩個(gè)平臺(tái)上開(kāi)發(fā)都有體貼可人的IDE用,程序員的幸福莫過(guò)于此呀。

好了,開(kāi)始正題,看vcer如何馴服xcode這匹小紅馬!(注:本文是寫(xiě)給愛(ài)好vc的windows programmer看的,如果你本來(lái)就是mac或xcode的粉絲且不恥于MS的人品技術(shù),那么請(qǐng)留步或是以批判的眼光來(lái)看待此文并歡迎指教)

首先介紹一下,我用vc是怎樣組織工程的。整個(gè)項(xiàng)目是一游戲客戶(hù)端引擎系統(tǒng),包括基礎(chǔ)類(lèi)庫(kù)、虛擬文件模塊、資源模塊、渲染器、腳本模塊、本地窗口模塊、應(yīng)用程序生命周期模塊、虛擬邏輯世界模塊、各擴(kuò)展對(duì)象模塊等。以上模塊分別以vc project形式存在并被編譯成.lib靜態(tài)庫(kù),另外有各種外殼(shell)程序如資源轉(zhuǎn)換打包工具、shader轉(zhuǎn)換工具、單元測(cè)試程序、游戲主程序等,它們也是vc project但被編譯成.exe應(yīng)用程序。上述所有vc project被組織在一個(gè)vc solution里。下面是一個(gè)簡(jiǎn)單的示意圖:

另外分享幾個(gè)關(guān)于vc的小技巧:
1、使用vsproPS文件來(lái)存放公用配置信息。vsprops文件是vc支持的一種配置文件,可認(rèn)為是配置文件的頭文件。每個(gè)vc project都可以繼承一個(gè)vsprops配置文件,并且vsprops文件之間還可以繼承。我一般會(huì)配置兩個(gè)vsprops文件,一個(gè)叫depend.vsprops用來(lái)存公用配置,如第三方庫(kù)的頭文件和庫(kù)文件依賴(lài)路徑、自定義的預(yù)編譯宏、各project輸出的obj/lib/exe文件的位置;另一個(gè)叫spec.vsprops用來(lái)存每個(gè)開(kāi)發(fā)者個(gè)人的配置,如整個(gè)第三方庫(kù)根目錄的路徑、某些特殊調(diào)試宏等。如下圖所示:

整個(gè)依賴(lài)關(guān)系為vc project -> depend.vsprops -> spec.vsprops。那么,有了兩個(gè)vsprops后,該怎么分別配置其中的內(nèi)容呢?

可以用兩個(gè)例子說(shuō)明:
2、配置第三方庫(kù)依賴(lài)路徑。

在我的項(xiàng)目里,第三方庫(kù)是個(gè)容量巨大的目錄,因?yàn)闉榱耸褂玫姆奖悖锩娣诺亩际蔷幾g好的頭文件和庫(kù)文件。不同的開(kāi)發(fā)人員從Git倉(cāng)庫(kù)中將其檢出后,可能會(huì)根據(jù)自己硬盤(pán)情況放到不同的位置。這時(shí),可以在spec.vsprops中定義一個(gè)變量$(depend_dir)指向?qū)嶋H存放第三方庫(kù)的路徑,然后在depend.vsprops中利用繼承得到的$(depend_dir)來(lái)填寫(xiě)對(duì)各種第三方庫(kù)的內(nèi)部引用,如圖:


depend.vsprops中使用的是統(tǒng)一變量$(depend_dir),內(nèi)容與個(gè)人無(wú)關(guān),這個(gè)文件是要提交到倉(cāng)庫(kù)里的。
spec.vsprops中的內(nèi)容則是個(gè)人相關(guān)的,不用提交,因此每個(gè)人可隨意修改,也不會(huì)影響到他人和最終發(fā)布。

3、配置個(gè)人調(diào)試用的預(yù)編譯宏。有時(shí)候,某些功能會(huì)在發(fā)布版中關(guān)閉,但是為了調(diào)試方便,開(kāi)發(fā)者會(huì)在自己機(jī)上編譯開(kāi)發(fā)版時(shí)打開(kāi)。這種功能的開(kāi)關(guān)一般都是用宏來(lái)做條件編譯。因此,可以把開(kāi)發(fā)者調(diào)試相關(guān)的宏定義在spec.vsprop中,而不是臨時(shí)去修改代碼,一旦忘記改回來(lái)又被提交的話(huà),這些功能就不小心被放出去了。而使用vsprop的做法,只要保證發(fā)布機(jī)器上的spec.vsprop文件不被隨便修改,就不會(huì)誤發(fā)布任何功能。
4、要學(xué)會(huì)數(shù)數(shù)……

好了,說(shuō)完vc,該介紹本文的主角xcode啦!先看一張圖,是上述solution在xcode里的組織結(jié)果:

先看一下vc與xcode之間有直觀(guān)對(duì)應(yīng)的概念:
vc solution -> xcode workspace
vc project -> xcode project
vc configuration -> xcode scheme
  vc vsprops -> xcode xcconfig

“一個(gè)大項(xiàng)目包含幾個(gè)小工程、大項(xiàng)目和小工程充滿(mǎn)各種神秘的配置選項(xiàng)”這個(gè)基本思路是一樣的,但差別也不少,講解如下:

1、首先xcode里把整個(gè)系統(tǒng)叫做workspace而非solution。在菜單欄File->New->Workspace即可新建一個(gè)這玩意,之后再用File->New->Project創(chuàng)建新工程時(shí),記得在最后一步“Add to”選擇剛才新建的workspace。由于xcode里居然允許project之間互相嵌套,我實(shí)在不能理解這種做法有什么好處,為了與vc習(xí)慣保持一致,我們應(yīng)在接下來(lái)的Group中選擇頂層項(xiàng)即讓此project“直轄”于workspace。

2、重復(fù)步驟1,將各個(gè)project輪流創(chuàng)建好后,會(huì)發(fā)現(xiàn)它們雜亂排成一列,這時(shí)出于視覺(jué)習(xí)慣要調(diào)整各project的上下順序,千萬(wàn)要小心!如果你不是粗心或是超級(jí)快手,你應(yīng)該會(huì)在放下的一瞬間發(fā)現(xiàn)彈出一個(gè)對(duì)話(huà)框,詢(xún)問(wèn)里你是否要把project A添加到project B(A是你想要移動(dòng)的,B是你想要移到它之后的),趕快點(diǎn)Cancel(希望你還沒(méi)有點(diǎn)OK)。其實(shí)這也是上面說(shuō)過(guò)的project間可以互相嵌套功能的體現(xiàn),只是在UI設(shè)計(jì)上,有個(gè)很不容易辨別的細(xì)節(jié):你再拖動(dòng)一下試試,這次注意觀(guān)察當(dāng)你把A拖到B下方時(shí),B下方邊框上會(huì)顯示一條粗線(xiàn)左端有一個(gè)圓圈,這時(shí)你保持水平左右移動(dòng)一下,看到了什么沒(méi)有?那個(gè)圓圈會(huì)左右跳動(dòng)!當(dāng)它特別靠左時(shí),才表示此次操作是要把A移到B下方,而它相對(duì)靠右時(shí),表示的是把A加入B,也就是剛剛、一般人第一次都會(huì)做錯(cuò)的操作!蛋疼了吧。。。

3、好了調(diào)整完順序,你可能會(huì)想像在vc里那樣,再建幾個(gè)filter(文件夾),把這些project分門(mén)別類(lèi)放好。于是你右鍵點(diǎn)來(lái)點(diǎn)去,菜單項(xiàng)里找來(lái)找去,終于……沒(méi)找到!是的,xcode沒(méi)有這個(gè)功能!現(xiàn)在你知道為什么第2步那么重要了……

4、xcode project與vc project有一個(gè)最大的不同:一個(gè)vc project只能有一個(gè)輸出(lib、dll或是exe),但一個(gè)xcode project可以有多個(gè)輸出,每個(gè)輸出叫一個(gè)target,每個(gè)target都有一份獨(dú)立的完整的(project級(jí)的)配置。這些target可以是純邏輯上的劃分,也可以是用來(lái)對(duì)應(yīng)不同平臺(tái)。我覺(jué)得這是個(gè)不錯(cuò)的設(shè)計(jì),比如一個(gè)project里面一些文件可以用來(lái)生成程序A,另一些文件用來(lái)生成程序B,這兩部份文件也有交集。如果是在vc里,那就只能配置成2個(gè)project了,或者為了完美解藕將公共部份再抽出來(lái)成1個(gè)project,2+1 project,簡(jiǎn)稱(chēng)3P……但在這個(gè)示例項(xiàng)目里,project已經(jīng)劃分得很細(xì)了,不存在上面說(shuō)的情況。所以我也沒(méi)用到過(guò)在一個(gè)project中定義兩個(gè)不同邏輯target的功能。但是在上圖里,顯示testgui這個(gè)工程確實(shí)有2個(gè)target,那是因?yàn)榭缙脚_(tái)的需要,我為每個(gè)project都定義了一個(gè)mac64 target和一個(gè)ios target。由于我并沒(méi)有支持ios emulator,否則的話(huà)還可以再添加第3個(gè)用于模擬器的target。

5、xcode project有哪些設(shè)置?首先,是屬于此工程的文件。文件不需要與工程在同目錄下,事實(shí)上我一般都會(huì)將代碼文件與IDE用的工程文件分開(kāi)放,在solution里建一個(gè)build目錄,里面再為各IDE建相應(yīng)子目錄。由于每個(gè)project會(huì)有多個(gè)target,因此針對(duì)每個(gè)文件還能單獨(dú)設(shè)置它屬于哪(幾)個(gè)target。利用這一點(diǎn),可以將分屬于各個(gè)平臺(tái)的源文件都添進(jìn)來(lái),方便查看編輯,同時(shí)為其設(shè)置適當(dāng)?shù)膖arget屬性,也不會(huì)影響編譯。其實(shí)這個(gè)功能在vc中也有,利用vc和xcode這類(lèi)IDE來(lái)查看源文件,可以方便的跳轉(zhuǎn)到各種聲明、定義中,比在ultraedit等普通編輯器里看要舒服多了。

下面是在vc里的設(shè)置。非win32平臺(tái)相關(guān)的源文件全部打上了紅色減號(hào),表示不被編譯。



下面是在xcode里設(shè)置文件屬性的面板,由于這個(gè)文件是屬于安卓平臺(tái)的,因此兩個(gè)target前都沒(méi)有勾選。

  在左側(cè)工程樹(shù)視圖中,除了看到所包含的源文件之外,還能看到各種依賴(lài)庫(kù)(Frameworks)、輸出文件(Products),初一看可能覺(jué)得有點(diǎn)亂,但其實(shí)也還不錯(cuò),與project有關(guān)的輸入輸出盡在眼底。但是Frameworks和Products下面的條目卻不像源文件一樣是直接通過(guò)右鍵菜單添加的,下面講工程設(shè)置時(shí)會(huì)解釋。

  xcode project的設(shè)置,一共有四個(gè)優(yōu)先級(jí),從低到高分別是系統(tǒng)默認(rèn)值、xc配置文件、project級(jí)配置、target級(jí)配置。比起vc來(lái),多了project/target這兩級(jí)的差別,至于xc配置文件,也就相當(dāng)于vsprops文件的性質(zhì)。

  點(diǎn)中project或target后,就會(huì)顯示其配置面板。大部份編譯相關(guān)選項(xiàng)都在Build Settings里,并且呈平板式顯示且右上角還有搜索功能,這比起VC的級(jí)聯(lián)配置菜單要輕爽得多。具體的選項(xiàng)就不多解釋了。下面說(shuō)一下xcconfig文件的使用。使用的理由與vc同,都是希望將公共配置抽取出來(lái),避免一經(jīng)修改就要去大量的project里一個(gè)個(gè)手工調(diào)整。手動(dòng)新建一個(gè)文本文件后綴改為.xcconfig放到workspace同級(jí)目錄。然后在各個(gè)project中通過(guò)右鍵菜單里的Add Files to選項(xiàng)把它加進(jìn)來(lái),之后轉(zhuǎn)到project級(jí)配置的info面板,第二欄Configurations里,有debug/Release兩項(xiàng),再展開(kāi)后又會(huì)分別列出所有target,也就是說(shuō)針對(duì)每一個(gè)target的debug和release版,都可以單獨(dú)指定一個(gè)xcconfig文件。但沒(méi)有必要那么繁瑣,直接在debug/release這一級(jí)指定就可統(tǒng)一應(yīng)用在所有target上。這里值得注意的是xcode里的Configuration與vc不一樣,xcode里指的就是xcconfig配置文件,而同樣的術(shù)語(yǔ)在vc中指的是debug/release/debug dll/release dll這類(lèi)的整體編譯環(huán)境,vc中Configuration的范圍比xcode更大。

  指定好xcconfig之后,來(lái)看一下這個(gè)文件里都能填些什么。先看下我填的內(nèi)容:

EFFECTIVE_PLATFORM_NAME=
FXROOT=$(SRCROOT)/../..
DEPROOT=$(FXROOT)/../fxd

HEADER_SEARCH_PATHS[arch=armv6] = $(FXROOT) $(DEPROOT)/common $(DEPROOT)/iOS/include
HEADER_SEARCH_PATHS[arch=x86_64] = $(FXROOT) $(DEPROOT)/common $(DEPROOT)/darwin/include /opt/local/include
HEADER_SEARCH_PATHS[arch=i386] = $(FXROOT) $(DEPROOT)/common $(DEPROOT)/linux/include

SYMROOT=~/fxo/xcode/bin/$(SDKROOT)/$(ARCHS)
OBJROOT=~/fxo/xcode/obj/$(SDKROOT)/$(ARCHS)
CONFIGURATION_BUILD_DIR=$(SYMROOT)


LIBRARY_SEARCH_PATHS[arch=armv6] = $(inherited) $(SYMROOT) $(DEPROOT)/iOS/lib
LIBRARY_SEARCH_PATHS[arch=x86_64] = $(inherited) $(SYMROOT) $(DEPROOT)/darwin/lib /opt/local/lib
LIBRARY_SEARCH_PATHS[arch=i386] = $(inherited) $(SYMROOT) $(DEPROOT)/darwin/linux/lib /opt/local/lib


OTHER_CFLAGS[sdk=iphone*] = -DTARGET_IPHONE=1
OTHER_CPLUSPLUSFLAGS[sdk=iphone*] = $(inherited) -x objective-c++

這里面包括:1)頭文件和庫(kù)文件搜索路徑,并且通過(guò)[arch=xxx]來(lái)區(qū)分不同架構(gòu);2)臨時(shí)和最終文件的輸出位置,這是通過(guò)SYMROOT和OBJROOT指定的。默認(rèn)xcode會(huì)把輸出文件寫(xiě)到它自己的安裝目錄下去,找起來(lái)不方便,所以我都會(huì)統(tǒng)一修改它們,但除了在這里定義輸出文件外,還需要在另一處修改:主菜單File->Workspace Settings->Build->Advanced,選中Legacy,也就是隨各target自定,即我們?cè)趚cconfig中指定的值;3)一些編譯選項(xiàng),如宏、編譯器參數(shù)等。 

 6、把所有project配好后,那么就要設(shè)定其構(gòu)建順序、產(chǎn)出、調(diào)試等等solution級(jí)的參數(shù)了。這一級(jí)在xcode里叫做scheme,一個(gè)scheme定義了一套project(target)的集合,相當(dāng)于vc里的Configuration。在Manage Scheme面板上可以創(chuàng)建新的scheme,在創(chuàng)建scheme時(shí)需要指定一個(gè)target,也就是此scheme的最終輸出,這個(gè)target所屬的架構(gòu)也就決定了此scheme的架構(gòu)。不同架構(gòu)的scheme有不同的運(yùn)行調(diào)試環(huán)境,比如x64架構(gòu)的shceme,就只能在64位mac上運(yùn)行,而arm架構(gòu)的則可以在iphone和ipad兩種設(shè)備以及相應(yīng)的模擬器上運(yùn)行(模擬器其實(shí)是i386架構(gòu)的,這里的從屬關(guān)系和設(shè)計(jì)概念我還沒(méi)徹底搞清楚)。在添加完scheme時(shí),記得把它的Container設(shè)成整個(gè)workspace而不是某個(gè)project,并且把后面的shared勾上,這樣這個(gè)scheme的信息會(huì)存在workspace下的xcsharedata子目錄里,把它提交到倉(cāng)庫(kù)中,就可供所有人一起使用了。如果沒(méi)勾上shared,那么會(huì)存在xcuserdata里,這個(gè)目錄一般是不提交的,類(lèi)似vc里每個(gè)project還會(huì)有一個(gè)$(machine).user后綴文件,里面存的也是不應(yīng)提交的諸如調(diào)試時(shí)工作目錄、環(huán)境變量等信息的個(gè)人配置。

  下面這個(gè)是Manage Scheme的界面,紅色標(biāo)出了要特別去設(shè)的地方。

 一旦把project和scheme都配好后,就可以舒舒服服享受IDE開(kāi)發(fā)調(diào)試的方便和爽快了?催@張~

 用過(guò)vc的人想必會(huì)有體會(huì),當(dāng)突然轉(zhuǎn)到命令行下工作,要用gdb這種看局部變量看源代碼都得敲命令的古老程序來(lái)調(diào)試時(shí),那種世界末日的感覺(jué)吧。誠(chéng)然人不能完全依靠工具,但也沒(méi)必要極端的回避工具。使用工具的目的也就是為了增加生產(chǎn)效率,當(dāng)然是在深入理解工具背后原理的前提下。事實(shí)上我這個(gè)項(xiàng)目在所有平臺(tái)都是可以用一套統(tǒng)一的makefile構(gòu)建的(在windows下通過(guò)cygwin),包括ios和android。并且在初次接觸一個(gè)平臺(tái),在其上工作時(shí),使用命令行式的簡(jiǎn)單工具是非常必要的,因?yàn)檫@樣更有助于理解工作流程的本質(zhì)。但是一旦這套機(jī)制清楚了,就沒(méi)必要困守成規(guī),如果能尋找到一條更方便簡(jiǎn)捷的途徑,又何樂(lè)不為呢。所以我才想在mac上對(duì)xcode一番探索,期間也在不少群和論壇上問(wèn)過(guò)人,但得到的相當(dāng)一部份答復(fù)不是說(shuō)IDE都是浮云,就是說(shuō)別把windows的那一套帶到mac來(lái),我只能笑而不語(yǔ),個(gè)中艱辛雖不足道,但上面這段感觸就當(dāng)是對(duì)之的回答和本文的總結(jié)吧~

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀(guān)圍觀(guān)
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(2)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)