首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建苹果硅mac模拟器的静态库

构建苹果硅mac模拟器的静态库
EN

Stack Overflow用户
提问于 2020-12-02 22:37:09
回答 1查看 1.1K关注 0票数 6

我的静态库是用xcodebuild构建的,然后从模拟器和设备构建结果创建一个fat库。下面是我的xcodebuild命令:

代码语言:javascript
复制
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命令:

代码语言:javascript
复制
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"

在检查了胖库中的体系结构之后,我得到了:

代码语言:javascript
复制
$ lipo -info MyLibCommon.a 
Architectures in the fat file: MyLibCommon.a are: armv7 i386 x86_64 arm64

但是,当我通过cocoapods将库添加到一个项目并在苹果的新硅上运行该项目(带有arm64芯片组)时,我得到了以下编译错误:

代码语言:javascript
复制
building for iOS Simulator, but linking in object file built for iOS, file 'MyLibCommon.a' for architecture arm64

不包括 --模拟器的arm64架构--不是一种选择,因为在苹果上,硅Mac有arm64芯片组。

你知道我怎么能为苹果硅模拟器建立一个静态库吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 02:10:10

这是不可能的

很可能,您的模拟器二进制文件只是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),不能在相同的fat输出文件中

无论您是使用成熟的二进制文件、未链接的对象文件还是静态库,都会发生这种情况。原因很简单,就是fat文件格式的一个缺点:每个体系结构只能有一个切片。你想要arm64 iOS和苹果硅模拟器,但那将是2倍arm64。

您可能会尝试构建一个单薄的arm64二进制文件,它可以同时工作在iOS和macOS上,但这也是不可能的。二进制文件是平台锁定的:

代码语言:javascript
复制
% 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。内核实际上将忽略这个load命令,但是dyld不会。在一个二进制文件中也不能有两个这样的加载命令,这也被认为是无效的。

您可能还记得苹果公司宣布中提到的“Universal2”文件格式,或者引用这一说法--但是他们撒谎了。没有“通用2",它与十年前的文件格式完全相同。当他们说“通用2”时,他们的意思是“向arm64二进制文件中添加一个macOS片段”。

在我看来,你有三个选择:

  1. 您可以构建单独的库,并将名称保持单独。
  2. 您从不同时构建两个体系结构。
  3. 您为x86_64构建模拟器目标,并在Rosetta下运行它。

后两者都在互联网上得到了广泛的推荐,第二位是“只为主动架构构建”,第三位是“排除arm64”。考虑到罗塞塔预计最终会消失,第三种选择从长远来看似乎不可行。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65117197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档