我的静态库是用xcodebuild构建的,然后从模拟器和设备构建结果创建一个fat库。下面是我的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 iphonesimulatorlipo命令:
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"在检查了胖库中的体系结构之后,我得到了:
$ lipo -info MyLibCommon.a
Architectures in the fat file: MyLibCommon.a are: armv7 i386 x86_64 arm64但是,当我通过cocoapods将库添加到一个项目并在苹果的新硅上运行该项目(带有arm64芯片组)时,我得到了以下编译错误:
building for iOS Simulator, but linking in object file built for iOS, file 'MyLibCommon.a' for architecture arm64不包括 --模拟器的arm64架构--不是一种选择,因为在苹果上,硅Mac有arm64芯片组。
你知道我怎么能为苹果硅模拟器建立一个静态库吗?
发布于 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上,但这也是不可能的。二进制文件是平台锁定的:
% 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 2对platform 1。内核实际上将忽略这个load命令,但是dyld不会。在一个二进制文件中也不能有两个这样的加载命令,这也被认为是无效的。
您可能还记得苹果公司宣布中提到的“Universal2”文件格式,或者引用这一说法--但是他们撒谎了。没有“通用2",它与十年前的文件格式完全相同。当他们说“通用2”时,他们的意思是“向arm64二进制文件中添加一个macOS片段”。
在我看来,你有三个选择:
后两者都在互联网上得到了广泛的推荐,第二位是“只为主动架构构建”,第三位是“排除arm64”。考虑到罗塞塔预计最终会消失,第三种选择从长远来看似乎不可行。
https://stackoverflow.com/questions/65117197
复制相似问题