2015年2月1日後新提交的應用必須要支持64位架構。
我所使用的是cocos2d-x V2.0版本,而且源碼有部分代碼是修改過的。好在cocos2d-x官方已經放出了一個支持64位的2.2.6版本,可以做爲參考。
在修改之前,有必要了解一下32位與64位的一些區別,網上能搜索到的資料有很多,這裏簡單列一下(儘量通過圖表的方式)
I代表int、L代碼Long、P代表Pointer
通過上圖,大家很容易就發現主要的不同點在long與pointer上
參考資料:
32位程序與64位程序區別
將 Linux 應用程序移植到 64 位系統上
64位編程的33條軍規
linux GCC 64位編程技巧
20 issues of porting C++ code on the 64-bit platform
-------------------- 華麗的分隔線 --------------------
還有一些準備工作需要做,升級Mac OS,然後安裝XCode 6.x,只有6.x才支持IOS8.x,然後設置build的選項。
然後command + b進行build,如果報錯,查看報錯的信息然後使用cocos2d-x 2.2.6版本里面的代碼與當前使用的代碼進行對比,修改完成之後再次build
第三方庫:libcurl記得替代,如果你還使用了其它的庫,記得也一併替換掉。
在編譯的過程中遇到的絕大部分的問題都能通過搜索獲得到答案 :)
上面這個過程相對而言比較簡單,對於自已寫的代碼,如果有函數需要獲得指針的信息,把 int 改爲 long 即可 (原理可參見本文的第一張圖)
我遇到的主要問題是
Undefined symbols for architecture arm64: "CocosDenshion::SimpleAudioEngine::preloadEffect(char const*)", referenced from:
凡是調用了CocosDenshion裏方法的代碼都會顯示有問題,我就奇怪了,CocosDenshion我檢查過編譯的各項參數,也檢查過當前編譯項目的Library Search Path,確認所有的都沒有問題,清理、重新編譯,鬧騰了好久還是沒解決,直到第二天猛然看到這段錯誤上面一段提示,有一個路徑,我用shell查了一下,發現了問題:
該目錄下面居然有一個.a文件,不知道怎麼操作的,也就是說它優先使用了這裏的庫(32位),導致無論我怎麼編譯和操作,新生成的靜態庫(libCocosDenshion.a)都是沒有用到的,刪除、編譯,一切都OK了,太坑了,花了一天半的時間>_<
下面引用一段關於Undefined symbols for architecture 的說明(網上能搜索到關於它的問題不是armv7(s)就是使用cocos2d-x V3.x的處理方案,關於cocos2d-x的幾乎是沒有,好憂傷~ ~)
如果在源代碼中,找不到一個標識符的聲明,無論是變量名、類名或是方法名,則在編譯時會得到“Use of undeclared identifier 'XXXX'”錯誤,而如果編譯器找到了它的聲明,而卻不知道它怎麼實現的,看不到實現代碼或者說目標文件裏沒有這個實現,則會出現鏈接錯誤。 錯誤分類: 1) 引入了需要用到的庫的頭文件,卻沒有鏈接正確的實現庫。因爲Xcode本身所支持的庫是Static Library,即.a方式,.a文件裏只有實現。使用的時候需要另外引入頭文件,那麼就有可能把頭文件放進來,沒有放.a或放了錯誤的版本。 2) Build Settings或者Build Phases配置有誤。檢查Build Phases裏的Link Binary With Libraries和Build Settings裏的幾項Search Path。 3) 從外部導入的文件沒有加入到特定的target中。.a、.m、.framework等引入到工程中,卻沒有勾選當前Build的target,會出現這個問題,可以選中特定的文件,在右側邊欄中選中target。 4) 未包含處理器架構指令集的問題。報錯時的提示一般都是“Undefined symbols for architecture armv7/arm64”之類的,而“for architecture armv7/arm64”就是說沒有支持armv7,在build settings裏architecture相關的幾項需要配置正確。
引用自:http://www.molotang.com/articles/1593.html
原文:http://stackoverflow.com/questions/6429494/undefined-symbols-for-architecture-armv7
參考:
I was able to build the cocos2d-x 2.2 in arm64 (Xcode 6.1) #9322
64-bit and iOS 8 Requirements for New Apps
XCode升級到5.1.1(5B1008)導致編譯出問題的解決方案
修改cocos2d-2.0-x-2.0.3支持c++11
error when creating an archive of my cocos2d app
xcode升級6.0.1之後Undefined symbols for architecture arm64