Xcode6 和 Cocos2dx3.1以下版本的不兼容問題

昨天升級了一下Xcode6,遇到了兩個問題。


第一個,無法準確識別IOS device。始終顯示爲Unavailable。


這個問題呢..應該是Xcode6Beta版本的小故障,當年Xcode5剛出來的時候也這樣。你可以選擇將Xcode退出,確保手機已經連接上Mac,再次啓動Xcode來解決這個問題。

當然如果這個辦法無法解決問題,你也可以通過將iTunes升級到最新版本來解決這個問題。


第二個問題,cocos2dx3.1以下版本在Xcode6的IOS框架下編譯出錯,主要是三個Error





編譯器告訴我們在libcocos2dx——也就是cocos2dx庫中用到的_fwrite$UNIX2003以及_strerror$UNIX2003未被定義。

那麼我們可以猜測,這次的Xcode升級有可能將原有的這兩個類C語言模塊從UNIX內核裏刪掉了(不要問爲什麼會出現UNIX...因爲mac OS就是一個做的比較漂亮的Unix而已..)


我們可以通過extern""的方式對他們進行定義

extern "C"{

    size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )

    {
        return fwrite(a, b, c, d);
    }

    char* strerror$UNIX2003( int errnum )
    {
        return strerror(errnum);
    }
}


——————————————————————————————————————————————————————————————————————

插播一段C語言小知識

被extern限定的函數或變量是extern類型的。extern修飾變量的聲明。舉例來說,如果文件a.c需要引用b.c中變量int v,就可以在a.c中聲明externint v,然後就可以引用變量v。這裏需要注意的是,被引用的變量v的鏈接屬性必須是外鏈接(external)的,也就是說a.c要引用到v,不只是取決於在a.c中聲明externint v,還取決於變量v本身是能夠被引用到的。這涉及到c語言的另外一個話題--變量的作用域。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點是,externint v可以放在a.c中的任何地方,比如你可以在a.c中的函數fun定義的開頭處聲明extern int v,然後就可以引用到變量v了,只不過這樣只能在函數fun作用域中引用v罷了,這還是變量作用域的問題。對於這一點來說,很多人使用的時候都心存顧慮。好像extern聲明只能用於文件作用域似的。


所以被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的;
未加extern“C”聲明時的編譯方式。
首先看看C++中對類似C的函數是怎樣編譯的。
作爲一種面向對象的語言,C++支持函數重載,而過程式語言C則不支持。函數被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函數的原型爲:
void foo( int x, int y );
該函數被C編譯器編譯後在符號庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都採用了相同的機制,生成的新名字稱爲“mangled name”)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。例如,在C++中,函數void foo( int x, int y )與void foo( int x, float y )編譯生成的符號是不相同的,後者爲_foo_int_float。
所以我們上面這段代碼的作用就是將這兩個未定義函數定義成全局可以訪問。

這樣我們的問題就解決啦。當然還是推薦使用最新的cocos2dx,不要爲了舊版本耽誤過多時間


發佈了40 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章