轉自:http://www.cnblogs.com/meteoric_cry/p/4171535.html
2015年2月1日后新提交的應用必須要支持64位架構。
我所使用的是cocos2d-x V2.0版本,而且源碼有部分代碼是修改過的。好在cocos2d-x官方已經放出了一個支持64位的2.2.6版本,可以做為參考。
在修改之前,有必要了解一下32位與64位的一些區別,網上能搜索到的資料有很多,這里簡單列一下(盡量通過圖表的方式)
I代表int、L代碼Long、P代表Pointer
通過上圖,大家很容易就發現主要的不同點在long與pointer上
參考資料:
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)導致編譯出問題的解決方案