建置 Unity iOS xcode 專案遇到的錯誤與解決方案 (Linker error)
建置 xcode 專案丟出的錯誤訊息:Undefined symbols
最近要在 Unity 建置 iOS 專案遇到的錯誤問題,第一次跑整個建置流程,先在 Unity 執行遊戲建置產生 xcode 專案,再開啟 xcode 專案進行 app 打包建置,但卻遇到以下 linker 錯誤:
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MFMailComposeViewController", referenced from:
objc-class-ref in ISN_SocialGate.o
"_OBJC_CLASS_$_SLComposeViewController", referenced from:
objc-class-ref in ISN_SocialGate.o
"_SLServiceTypeFacebook", referenced from:
-[ISN_SocialGate fbPost:url:media:] in ISN_SocialGate.o
"_ACAccountTypeIdentifierTwitter", referenced from:
-[ISN_SocialGate twitterPostGif:url:] in ISN_SocialGate.o
-[IOSTwitterPlugin authificateUser] in ISN_SocialGate.o
-[IOSTwitterPlugin loadUserData] in ISN_SocialGate.o
-[IOSTwitterPlugin IsTwitterAuthed] in ISN_SocialGate.o
"_OBJC_CLASS_$_SLRequest", referenced from:
objc-class-ref in ISN_SocialGate.o
"_OBJC_CLASS_$_ACAccountStore", referenced from:
objc-class-ref in ISN_SocialGate.o
"_OBJC_CLASS_$_SLComposeServiceViewController", referenced from:
objc-class-ref in ISN_SocialGate.o
"_OBJC_CLASS_$_MFMessageComposeViewController", referenced from:
objc-class-ref in ISN_SocialGate.o
"_SLServiceTypeTwitter", referenced from:
-[ISN_SocialGate twitterPost:url:media:] in ISN_SocialGate.o
___37-[ISN_SocialGate twitterPostGif:url:]_block_invoke in ISN_SocialGate.o
___32-[IOSTwitterPlugin loadUserData]_block_invoke in ISN_SocialGate.o
-[IOSTwitterPlugin postWithMedia:media:] in ISN_SocialGate.o
-[IOSTwitterPlugin post:] in ISN_SocialGate.o
-[IOSTwitterPlugin IsTwitterAvaliable] in ISN_SocialGate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因與解決方案
第一次使用 xcode 來建置,透過 Google 搜尋錯誤訊息了解其問題,是我們專案使用到的第三方函數庫 (third-party library),Stan’s Assets 中的 Ultimate Mobile,使用到 iOS framework,但在 xcode 專案卻沒有設定引用,所以建置 linker stage 丟出如此錯誤。
解決方案就是修改 xcode project 組態,,加入找不到 Symbols 所屬的 framework 即可:
- View > Navigators > Show Project Navigator
- 在視窗中點選專案圖示,例如這次是 Unity-iPhone
- 在設定頁中找到 General > Linked Frameworks and Libraries
- 加入缺少的函數庫
- 應該根據自己專案的 Undefined symbols 訊息,來設定需要額外引用的 frameworks,至於怎麼知道缺少的 Symbols 要引用哪些 frameworks 或是 libraries,Google search 會是一個很好的查詢管道
- GameKit.framework
- Social.framework
- Accounts.framework
- MessageUI.framework
- Twitter.framework
Unity 的額外設定
從 Unity 專案中點選這次造成問題的 ISN_SocialGate,實際這邊可以額外設定 framework dependencies,確保 Unity 再建置 xcode 專案時,能自動將這幾個 framework 加入引用設定,而不需要再修改 xcode 專案設定。
後來發現如果是直接在 Mac 開啟 Unity 建置 xocde 專案的話,Unity 會自動判斷並加入適當的 framework dependencies……。這錯誤是因為使用 Windows 建立 xcode 專案,再到 Mac 上開啟 xcode 建置才發生的錯誤啊。
沒有留言: