2013-11-20 26 views
2

我已經將FacebookSDK添加到我的Unity項目中,根據教程https://developers.facebook.com/docs/unity/getting-started/canvas/面向Unity iOS的FacebookSDK Mach-O鏈接器錯誤 - 未定義的符號_iosLogin,

這意味着我已經下載SDK .unitypackage,將其導入Unity項目並在配置設置檢查器中設置應用程序名稱和ID。

當我嘗試爲設備,Xcode的構建掛在下面的Mach-O鏈接錯誤:

Undefined symbols for architecture armv7: 
    "_iosLogin", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosLogout", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosInit", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosSetShareDialogMode", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosFeedRequest", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosAppRequest", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosFBSettingsPublishInstall", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosFBAppEventsSetLimitEventUsage", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosGetDeepLink", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosFBAppEventsLogPurchase", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
    "_iosFBAppEventsLogEvent", referenced from: 
     RegisterMonoModules() in RegisterMonoModules.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

它看起來像團結,Xcode的還是我忘了,包括一些圖書館,搜索路徑或源文件的某處。你能幫我找出發生了什麼事嗎?你知道這個符號應該在哪個文件中,或者如何設置鏈接器?

Unity 4.3.0f4 (also tried 4.2.?) 
Facebook SDK 4.3.4 (also tried 4.3.3) 
Xcode 5.0.2, deployment target 4.0 (also tried 6.1) 

回答

3

這些符號是從FacebookSDK.a,這應該得到納入由/Assets/Facebook/Editor/FacebookPostprocess.cs的[PostProcessBuild步驟Xcode項目出口。該文件實際上會遍歷項目中以文件名中的「.projmods」結尾的所有文件,並將它們作爲轉換應用於xcode項目。我見過有這樣的問題,當2點出問題這裏:

  1. 我已經刪除或者FacebookPostprocess.cs或一些從我的項目意外的「.projmods」文件。檢查兩者是否存在。在這種情況下,特定的projmods文件應該位於/ Assets/Facebook/Editor/iOS。
  2. 您有自己的[PostProcessBuild]步驟,可以更改Facebook的更改。您可以通過將可選的「order」參數應用於PostProcessBuild屬性來解決此問題。

您也可以在Xcode中檢查FacebookSDK.a確實是在項目的/ Libraries組中,並且在「構建階段」下它被包含爲與之鏈接的二進制文件。

在構建時還要仔細查看Unity的日誌輸出。有時projmods後處理器會抱怨找不到文件等的這

+1

謝謝你的建議。 我已經檢查過Unity腳本,並且在ParseDictionary方法中的Facebook/Editor/iOS/third_party/XCodeEditor-for-Unity/PBXParser.cs中發現錯誤。有一個企圖dictionary.Add()與重複鍵184行。我認爲有一些配置文件本身沒有問題,但我已經添加檢查重複鍵,然後我能夠建立。但只是第一次(或刪除iOS生成文件夾後)。不要構建現有的項目。 如果我嘗試第二個(第三,...)構建和運行,Unity會生成格式錯誤的xml Info.plist。 –

+0

另一個發現:當我用Replace替代Append而第二次構建時,它沒有錯誤地構建,所以它可能是另一個錯誤。 所以我認爲它解決了。也許它可能是可用的,如果你有任何想法爲什麼ParseDictionary會嘗試添加重複鍵或從哪裏獲取數據,但這不是必需的。 –

1

另外一個潛在的原因:Facebook的SDK使用第三方庫XCode-Editor-for-Unity做的Xcode項目後處理。如果項目中的任何其他中間件也使用它,則可能會有重複的實例。

在我們的例子中,SponsorPay api也有一個這個庫的副本,當導入Facebook API時它覆蓋了SponsorPay的實現(它對原始庫有一些修改)。

該走了幾步來解決:

首先,每個實例移動到自己的命名空間,並解決他們的引用:

的Facebook /編輯/的iOS/XCodeEditor換團結/ *的.cs:

namespace UnityEditor.XCodeEditor.Facebook 
{ 
    ... 
} 

,並在Facebook中/編輯/ FacebookPostprocess.cs:

// our 'XCProject' is now in the UnityEditor.XCodeEditor.Facebook namespace 
UnityEditor.XCodeEditor.Facebook.XCProject project = 
    new UnityEditor.XCodeEditor.Facebook.XCProject(path); 

...併爲其他圖書館做同樣的事情。


一旦我們有這個固定的,我們遇到了最後一個問題:每個庫的後處理腳本走在整個項目中被錯誤執行查找.projmods文件,這意味着這些文件已經處理過的兩次(一次,這引發了另一次崩潰)。

所以,最後一個步驟中,確保每個庫的後處理只走自己的路:

// Find and run through all projmods files to patch the project 

// Set this to your project's Facebook API location: 
string sdkPath = "Facebook/Editor/iOS"; 
string projModPath = System.IO.Path.Combine(Application.dataPath, sdkPath) 
var files = System.IO.Directory.GetFiles(projModPath, "*.projmods", System.IO.SearchOption.AllDirectories); 

foreach (var file in files) 
{ 
    project.ApplyMod(Application.dataPath, file); 
} 
project.Save(); 

,並再次,這雙檢爲其他圖書館也是如此。

相關問題