[英]building for iOS simulator, but linking in object file built for OSX, for architecture x86_64 in Xcode 7
[英]Linking to iOS simulator binaries on OSX
我很好奇如果我在Mac應用程序中鏈接到iOS模擬器框架會發生什么。 所以我將UIKit復制到它自己的文件夾(因此框架搜索路徑不會包含所有iOS模擬器框架,就像CoreFoundation在Mac和iOS上都有不同的標題),並將其拖入Xcode的鏈接部分。 Xcode給我的錯誤是:
為MacOSX構建,但是針對架構x86_64為iOS模擬器文件'/Users/jonathan/Desktop/macuikit/UIKit.framework/UIKit'構建的dylib鏈接
這兩種架構都是x86_64,所以它怎么能告訴框架是專門針對iOS模擬器的,我刪除了對Info.plist之類的所有iOS的引用,甚至嘗試刪除除了UIKit二進制文件之外的一切,但同樣的錯誤出現了。 它自己的二進制文件中有什么東西可以告訴鏈接器它可以運行哪個平台,而不僅僅是架構? 我查看了Mach-O標頭但是只有CPU類型和子類型的字段,並且沒有按預期的模擬器值。
經過一些挖掘后,事實證明可以運行庫的平台確實在二進制文件中指定。 實際上,您可以在您喜歡的Hex編輯器中編輯二進制文件,並使鏈接器完全跳過此檢查。
此信息未在Mach-O標頭中指定(正如您已經意識到的那樣)。 相反,它被指定為加載命令類型。 您可以通過挖掘LLVM源來查看可用的類型。 具體來說,枚舉值LC_VERSION_MIN_MACOSX
和LC_VERSION_MIN_IPHONEOS
看起來很有趣。
現在,在我們的二進制文件中找到它的偏移量。 在MachOView
(或任何其他編輯器/查看器或您選擇的)中打開相同的MachOView
並記下偏移量:
注意到偏移量后,在Hex編輯器中跳轉到相同的位置並更新它。 我將LC_VERSION_MIN_IPHONEOS
(25)修改為LC_VERSION_MIN_MACOSX
(24)
保存更新並再次嘗試鏈接。 錯誤應該消失。 當然,當您嘗試實際運行示例時,您將遇到其他問題。 享受LLDB
樂趣然后:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.