簡體   English   中英

為 Apple Silicon mac 模擬器構建 static 庫

[英]Build static lib for Apple Silicon mac simulator

我的 static 庫是用 xcodebuild 構建的,然后從模擬器和設備構建結果創建了一個胖庫。 這是我的 xcodebuild 命令:

xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "iphoneos" -target "${LIB_NAME}Common" -sdk iphoneos

xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "iphonesimulator" -target "${LIB_NAME}Common" -sdk iphonesimulator

脂命令:

lipo -create "${DEVICE_DIR}/lib${LIB_NAME}Common.a" "${SIMULATOR_DIR}/lib${LIB_NAME}Common.a" -output "${INSTALL_DIR}/include/${LIB_NAME}/lib${LIB_NAME}Common.a"

檢查 fat lib 中的體系結構后,我得到:

$ lipo -info MyLibCommon.a 
Architectures in the fat file: MyLibCommon.a are: armv7 i386 x86_64 arm64

但是,當我通過 cocoapods 將 lib 添加到項目並在模擬器上的 Apple 新 Silicon(帶有 arm64 芯片組)上運行該項目時,出現以下編譯錯誤:

building for iOS Simulator, but linking in object file built for iOS, file 'MyLibCommon.a' for architecture arm64

排除模擬器的 arm64 架構不是一個選項,因為在 Apple Silicon Mac 上有 arm64 芯片組。

知道如何為 Apple Silicon Simulator 構建 static 庫嗎?

這不可能。

您的模擬器二進制文件很可能只是 i386 和 x86_64。 如果你真的有 arm64 iOS 二進制文件和 arm64 macOS 二進制文件, lipo會出錯:

致命錯誤:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: test.a.ios 和 test.a.macos 具有相同的架構 (arm64) 並且不能在相同的脂肪 output 文件

無論您嘗試使用完整的二進制文件、未鏈接的 object 文件還是 static 庫,都會發生這種情況。 原因很簡單,就是胖文件格式的一個缺點:每個架構只能有一個切片。 您需要 arm64 iOS 和 Apple Silicon 模擬器,但那將是 2x arm64。

您可能想嘗試構建一個同時適用於 iOS 和 macOS 的瘦 arm64 二進制文件,但這也是不可能的。 二進制文件是平台鎖定的:

% otool -l test.o.ios | fgrep -B1 -A5 LC_BUILD_VERSION
Load command 1
       cmd LC_BUILD_VERSION
   cmdsize 24
  platform 2
       sdk 14.2
     minos 14.2
    ntools 0
% otool -l test.o.macos | fgrep -B1 -A5 LC_BUILD_VERSION
Load command 1
       cmd LC_BUILD_VERSION
   cmdsize 24
  platform 1
       sdk 11.0
     minos 11.0
    ntools 0

注意platform 2platform 1 kernel 實際上會忽略這個加載命令,但dyld不會。 而且你也不能在一個二進制文件中有兩個這樣的加載命令,這也被認為是無效的。

您可能還記得Apple 公告中提到的“Universal 2”文件格式或引用該格式的內容 - 但他們撒了謊。 沒有“通用 2”,它與十年前的文件格式完全相同。 當他們說“universal 2”時,他們的意思是“向您的 macOS 二進制文件添加一個 arm64 切片”。

在我看來,您有以下三種選擇:

  1. 您構建單獨的庫並將名稱分開。
  2. 您永遠不會同時構建兩種架構。
  3. 您為 x86_64 構建模擬器目標並在 Rosetta 下運行它。

后兩者都在 inte.net 上被廣泛推薦,第 2 個是“只為活動架構構建”,第 3 個是“排除 arm64”。 鑒於 Rosetta 預計最終會離開 go,從長遠來看,第三種選擇似乎不可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM