你們可能以爲很奇怪,cocos2d-x引擎庫的編譯不是很簡單嘛?不就是下載源碼包,解壓並打開vs工程,分別對debug跟release兩個版本按一下編譯就行了嗎?對的,編譯就這樣就完成了。不過,我發現這樣編譯出來的庫好像「移植性」不是很好,不能直接拷貝到另一臺電腦直接使用。因而,我嘗試將這個編譯好的引擎庫變得更加的有「移植性」,並分享這個過程。 python
(這裏的「移植性」之因此用分號,是由於這不是說這個庫不能移植到不一樣平臺,而是說不能知道拷貝到其餘電腦,而後直接使用。) android
------------------------------------------------------------- windows
首先,說明一下我爲何要幹這個引擎庫拷貝的事情。是這樣的:我原本有個臺式機,已經配置好cocos2d-x環境了,而後最近買了手提。因而我想在手提上也裝個cocos2d-x環境。而後我想,既然cocos2d-x是一個C++編寫的函數庫(引擎框架),理論上應該是能夠直接拷貝到另一臺電腦使用的。因而我把臺式的編譯好的cocos2d-x庫拷貝到了手提,結果編譯一個HelloWorld都要整個cocos2d-x從新編譯一次。因此,一臺電腦編譯,拷貝到另外一臺電腦使用的想法彷佛有問題。 框架
------------------------------------------------------------- 函數
其實,在一臺電腦編譯,拷貝到另外一臺電腦使用的想法是沒問題的。不少C++的函數庫的編譯好的版本(binary)不就是這個意思嗎?cocos2d-x的之因此出問題,是cocos2d-x自己提供能的工程模板的依賴項的參數設置有一些問題。 ui
咱們經過cocos2d-x包中的tools目錄下的create_project的python腳原本建立cocos2d-x項目,打開新建的項目,咱們發現裏面不但有咱們想要的那個工程,還有libBox2d, libExtensions等好幾個工程,它們對應爲咱們所要用到的cocos2d-x框架的庫。它們跟咱們想要的工程放到同一項目,咱們的項目依賴於它們。在連接的時候,咱們的工程會到它們那裏查找想要的庫。這樣,咱們的工程就可使用這些庫了。右擊這些庫工程,查看屬性,點開「Build Events」,它們大部分都有定義「Pre Link Events」的操做。基本都是<if not exist "$(OutDir)" mkdir "$(OutDir)" xcopy /Y /Q "×××××" "$(OutDir)">。這就使得在第一次連接的時候,因爲尚未輸出的文件夾,因此它會新建輸出文件夾並將這幾個依賴庫的lib跟dll等都複製到項目的輸出文件夾中。這樣,咱們的工程就可以使用這些lib庫來連接編譯了。 spa
一切看上去都很好的發生着。不過,其實這種在同一個項目中多個工程,而且咱們的工程以來其餘庫工程的作法,正是cocos2d-x編譯包不能拷貝到其餘電腦直接使用的緣由。由於,在咱們把整個編譯包拷貝到別的地方的時候,那些庫工程的路徑實際上是發生了變化,vs在檢測路徑變化後,它會認爲工程變化了,代碼須要從新編譯,因此,咱們的cocos2d-x源碼就要從新編譯了。爲了解決這種路徑變化,庫工程從新編譯的問題,咱們須要作的就是移除以來的庫工程,直接指定咱們想要用的庫的位置就好了。由於咱們的庫其實早已經編譯好了。 操作系統
咱們來看看怎樣消除咱們項目對庫工程的依賴。咱們的項目是經過create_project.py腳原本建立的。打開這份代碼看一下,(雖然我不會python,可是大概知道它想要幹什麼。)它的做用就是複製cocos2d-x包下template目錄下的其中一種模板(如cpp)到project目錄下,並將工程的名字修改成咱們想要的名字。因此,理論上咱們只要去除template中項目(我修改的也只是cpp模板的)項目對庫工程的依賴性,後續建立的項目也就不會以來庫工程了。 debug
打開template\multi-platform-cpp\proj.win32下的HelloWorld.sln,右擊solution,查看其屬性,在configuration properties中,咱們看到咱們的項目依賴其餘幾個庫項目。關閉屬性,在Solution Explorer中,逐一右擊咱們的庫項目,點擊remove來將它們移除出工程。這是,咱們項目對庫項目的以來也自動消失了。可是,咱們的項目會由於找不到咱們想要的函數庫(cocos2d-x庫以及box2d庫等)而不能編譯。因此咱們還要爲項目指定函數庫的位置。假如配置過C++函數庫的朋友,可能對接下來的步驟很是熟悉。右擊HelloWorld項目,打開屬性,點開Linker->input。咱們看到已經有了要用的函數庫(lib),只是項目不知道這些庫放在哪裏。再點開VC++ Directories,看Library Directories項,爲它添加一個值,爲..\..\..\Debug.win32或..\..\..\Release.win32(根據你設置的是Debug仍是Release模式下的屬性而定)。它使用相對路徑,指定咱們編譯好的cocos2d-x庫的所在目錄。這樣,咱們的項目就能夠找到相應的lib並編譯和連接,而且不會由於cocos2d-x包的位置變化而從新編譯庫了。可是,咱們的工做還沒完成。由於在運行的時候,會由於找不到相應的dll而沒法運行。配置過C++函數庫的朋友可能會想,把cocos2d-x編譯出來的dll都放到system32下吧。這是一種方法,但有點違揹我剛開始想要的「移植性」。由於拷貝到另一臺電腦,又要從新將dll複製到system32了,而且cocos2d-x庫編譯出來的dll數量仍是比較多的。這裏,我使用的方法不知把dll複製到system32,而是在編譯的時候,讓vs自動把dll複製到咱們的項目輸出目錄。由於dll也不算大(debug跟release版的基本都是10 orm
m左右),而且不用手動配置,且咱們不想要cocos2d-x庫的時候,整個文件夾刪除就能夠了,不用污染到system32文件夾。實現方法是在項目的Build Events下的Pre Link Events添加操做腳本<if not exist "$(OutDir)" mkdir "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\..\Debug.win32\*.dll" "$(OutDir)"
>.
至此,咱們對模板項目的修改完成。注意,咱們是在修改模板,因此不要按下編譯鍵。而且關閉vs後,將模板文件夾下原本沒有的一些vs自動生成的文件刪除。這樣,咱們的「可移植」的cocos2d-x庫就製做完成了。
-------------------------------------------------------------
雖然,我用「可移植」這個詞。但其實仍是有不少限制的,例如想要使用編譯好的cocos2d-x庫的人的電腦要使用跟首次編譯cocos2d-x庫的人的電腦的vs版本相同,至於操做系統版本彷佛也有關聯。例如,我在臺式機win8 64位上經過vs2012編譯並製做的可移植模板,拷貝到個人手提win8 64位上,使用vs2012是能夠直接使用cocos2d-x庫而不用從新編譯的。但我拷貝到一臺win7 32位使用vs2010的電腦是是不能使用的。
因此,使用win8 64位vs2012的朋友,有興趣能夠下載下面連接分享的可移植包,看看是否真的可以直接使用:
爲了使壓縮包小一點,我把編譯好的sample整個給刪掉了(我對編寫sample的大神表示萬分的尊重)。還有也刪掉了其餘一些除Windows跟android項目的編譯好的庫。
還有,這個包理論上只要下載後,運行project目錄下的new.bat,便可生成工程,而後打開工程便可成功編譯。(這裏的new.bat實際上仍是調用create_project.py的,因此仍是要安裝python環境的。)
而使用其餘配置的windows的朋友,能夠嘗試下面連接,是修改後的模板工程。
理論上,只要你編譯好cocos2d-x源碼包,並將這個模板工程替換源碼包的模板。而後你就能夠將你編譯好的包分享給別人了,其餘使用系統配置跟你同樣的朋友就不用再編譯了。
-------------------------------------------------------------
最後,我說說我對cocos2d-x中模板原來使用工程依賴作法的見解(也只是個人我的見解,我猜猜而已)。這其實不是一個錯誤或者是一個失誤,而是另一種思路。它爲引擎庫使用者提供了更大的自由度,而且鼓勵咱們修改源碼。由於,假如咱們有什麼特別需求,須要修改引擎源碼。那麼,依賴的庫工程會檢測到源碼被修改了,庫便會被從新編譯,以達到咱們想要的效果。能夠說,這實際上是一種更高明的作法,一種針對更高要求的框架使用者的處理方法。不過,對於我這種渣渣普通使用者,不少時候我是想要開封后便可使用的編譯好的庫,無需繁雜的配置跟漫長的編譯。因此,我仍是但願有人可以作這種預編譯好的庫,可以讓我這種懶人使用者來用的。