1. 程式人生 > >使用“Cocos引擎”建立的cpp工程如何在VS中除錯Cocos2d-x原始碼

使用“Cocos引擎”建立的cpp工程如何在VS中除錯Cocos2d-x原始碼

前段時間Cocos2d-x更新了一個Cocos引擎,這是一個集合原始碼,IDE,Studio這一家老小的整合包,我們可以使用這個Cocos引擎來建立我們的專案。

在Cocos2d-x被整合到Cocos引擎之前,我們可以不那麼方便地在我們建立的工程裡除錯Cocos2d-x的程式碼,當我們使用了整合後的Cocos引擎,除錯Cocos2d-x的程式碼就變得更加,非常不方便了!

使用Cocos2d-x建立的專案,在最先的版本必須是在Cocos2d-x引擎的目錄下,放到其他的位置需要進行各種麻煩的設定,諸如標頭檔案,庫檔案,dll等的路徑設定。而且所有的專案都擠在同一個解決方案下實在是過於臃腫。於是出現了建立一個單獨的解決方案這種做法,但這種做法與Cocos2d-x的原始碼分離了,不方便程式碼閱讀和除錯,程式崩潰時無法定位到Cocos2d-x的堆疊。

這時候要除錯到Cocos2d-x的原始碼,需要將你的專案新增到對應的Cocos2d-x解決方案下,這時候即可以切換原始碼,也可以除錯,只是一個簡單的新增專案操作,隨時可以移除,對自己的專案沒有影響。這種情況下大可在自己單獨的專案中進行編碼開發,到需要除錯Cocos2d-x的時候再回到Cocos2d-x解決方案下進行除錯。雖然不那麼方便,但也不算太麻煩。

使用Cocos引擎建立的專案,想要除錯Cocos2d-x原始碼,就呵呵了,首先並Cocos自身的Cocos2d-x原始碼沒有工程檔案,也沒有原始碼,有的只是一堆的標頭檔案以及編譯好的lib,dll。原始碼都沒有,你怎麼檢視呢?關鍵是也無法除錯到Cocos2d-x的原始碼,這點就非常不方便了。

折騰了一晚上,找到了比較簡單的方法,希望除錯Cocos引擎生成的程式碼,需要以下幾個步驟:

1.下載與Cocos引擎對應版本的Cocos2d-x原始碼

2.編譯生成下載完的Cocos2d-x原始碼

3.將使用Cocos引擎建立的專案新增到Cocos2d-x的解決方案下

4.為自己的專案新增依賴項,依賴libcocos2d專案

5.安心除錯

第四個步驟在之前Cocos2d-x版本中是不需要的,但在這裡如果不新增依賴,將無法載入libcocos2d的除錯資訊檔案,也就無法除錯了。另外必須先編譯生成Cocos2d-x原始碼,否則直接編譯自己工程可能會報錯。另外版本必須對應,如果不對應的話可能會報錯,有些函式不對應執行會直接崩潰。

新增依賴項有兩種方法,第一種是在專案的生成依賴項中進行設定:

選擇自己的專案,然後勾選希望除錯的原始碼工程

另外一個方法是在解決方案的屬性中設定

完成設定之後libcocos2d.pdb檔案載入成功,成功地在cocos2dx中斷下斷點。

PS.可能還有其他的方法可以來完成這樣一個需求,例如指定原始碼目錄之類的,但設定依賴項應該是最方便的了。

2015-2-4 重要補充:

Cocos引擎生成的Project想要除錯還需要以下步驟:

1.將Main.cpp中,連結cocos2dx.lib的程式碼刪除,這裡會強制連結到Cocos引擎生成的無除錯資訊的lib,我們要連結到的是帶除錯資訊的lib檔案。

1 #if _MSC_VER > 1700
2 #pragma comment(lib,"libcocos2d_2013.lib")
3 #pragma comment(lib,"libbox2d_2013.lib")
4 #pragma comment(lib,"libSpine_2013.lib")
5 #else
6 #pragma comment(lib,"libcocos2d_2012.lib")
7 #pragma comment(lib,"libbox2d_2012.lib")
8 #pragma comment(lib,"libSpine_2012.lib")
9 #endif

2.在附加依賴項中新增連結庫glew32.lib,因為libcocos2d_2013.lib將glew32.lib一起連結進來了,所以連結了libcocos2d_2013.lib就不需要再連結glew32.lib了,但原始的libcocos2d.lib並沒有連結它。

3.將專案屬性——C/C++——程式碼生成——執行庫,從多執行緒DLL(/MD)修改為多執行緒除錯DLL(MDD)。Cocos引擎生成的DEBUG專案實際上使用的是Release的設定。

4.刪除專案屬性中,生成事件——預連結生成事件,命令列中的內容,避免額外的麻煩。

5.最後別忘了引用Cocos2d-x專案。