關於 web service, unity, blogger 等軟體工程筆記

建置 Unity iOS xcode 專案遇到的錯誤與解決方案 (Linker error)

Edit icon 沒有留言
Unity

建置 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
xcode 專案設定頁面

xcode 專案設定頁面

Unity 的額外設定

從 Unity 專案中點選這次造成問題的 ISN_SocialGate,實際這邊可以額外設定 framework dependencies,確保 Unity 再建置 xcode 專案時,能自動將這幾個 framework 加入引用設定,而不需要再修改 xcode 專案設定。

Unity 對於 mac library 的設定

Unity 對於 mac library 的設定

後來發現如果是直接在 Mac 開啟 Unity 建置 xocde 專案的話,Unity 會自動判斷並加入適當的 framework dependencies……。這錯誤是因為使用 Windows 建立 xcode 專案,再到 Mac 上開啟 xcode 建置才發生的錯誤啊。

沒有留言: