如何更新您的静态库架构以支持 arm64 构建?
Posted
技术标签:
【中文标题】如何更新您的静态库架构以支持 arm64 构建?【英文标题】:How to update our static library architecture for suporting arm64 Build? 【发布时间】:2014-04-18 00:06:56 【问题描述】:几天前,我创建了 static-library (Universal),它可以与 Xcode5.0 SDK7
配合使用。使用SDK7.1
更新Xcode5.1
后,如果我选择模拟器iPhone Retina(4-inch 64-bit)
将不起作用。然后我将使用 Bellow 设置更改来更新我的库。
我对三个目标做同样的事情:-
对于运动模拟器和设备,我将 Universal lib 放入其中,并在其中运行脚本:-
在此之后,我再次构建 lib 并像之前在我的项目中所做的那样使用。但是iPhone Retina(4-inch 64-bit)
Undefined symbols for architecture x86_64:
仍然遇到同样的问题
所以,我的问题是更新 arm64 的 lib 是否需要任何额外的更改,或者我在上述步骤中犯了任何错误。如果我错了,请告诉我。
更新我的静态库以支持 64Bit architecture
需要进行哪些更改
注意:
我要求我自己创建的库更新。我没有使用第三方库。 更新
我在终端中使用了这个lipo -info testingLibImport/libLibNSlog.a
命令,输出为:
Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64
【问题讨论】:
***.com/questions/20234623/… 和 ***.com/questions/20264574/… 可能对您有帮助 看到这个***.com/questions/22331908/… 请在我的问题中看到我已经完成了这个更改但得到了同样的错误。 在重复投票之前,这个问题是关于我自己创建的 Lib 淹没而不是其他人。我想知道如何更新我的库。 在声明你的新版本不工作之前一定要清理你的派生数据 【参考方案1】:我在 XCode 6.4 中找到的另一个解决方案是添加 ONLY_ACTIVE_ARCH=NO 并且不指定架构。所以
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration $CONFIGURATION -sdk iphonesimulator BUILD_DIR="$BUILD_DIR" BUILD_ROOT="$BUILD_ROOT"
将在您的库中构建 i386 和 x86_64 架构。
这是我构建所有架构的完整通用库运行脚本。
# define output folder environment variable
UNIVERSAL_OUTPUTFOLDER=$BUILD_DIR/$CONFIGURATION-universal
# Step 1. Build Device and Simulator versions
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration $CONFIGURATION -sdk iphoneos BUILD_DIR="$BUILD_DIR" BUILD_ROOT="$BUILD_ROOT"
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration $CONFIGURATION -sdk iphonesimulator BUILD_DIR="$BUILD_DIR" BUILD_ROOT="$BUILD_ROOT"
# make sure the output directory exists
mkdir -p "$UNIVERSAL_OUTPUTFOLDER"
# Step 2. Create universal binary file using lipo
lipo -create -output "$UNIVERSAL_OUTPUTFOLDER/lib$PROJECT_NAME.a" "$BUILD_DIR/$CONFIGURATION-iphoneos/lib$PROJECT_NAME.a" "$BUILD_DIR/$CONFIGURATION-iphonesimulator/lib$PROJECT_NAME.a"
# Last touch. copy the header files. Just for convenience
cp -R "$BUILD_DIR/$CONFIGURATION-iphoneos/include" "$UNIVERSAL_OUTPUTFOLDER/"
【讨论】:
非常感谢。正是我想要的。 @dwxw 当我将上述脚本与 xcode 10 一起使用时,它给了我一个错误:访问构建数据库“/Users/mystaticLib/build/XCBuildData/build.db”:数据库被锁定可能有两个并发在同一文件系统位置运行的构建。 更多详情请查看:***.com/questions/53041772/…【参考方案2】:我昨天也遇到了同样的问题,经过大量谷歌搜索并尝试了不同的解决方案后,我放弃了自己尝试。从提供的不同解决方案中我所能理解的是,当我运行“lipo -info library.a”时,它不是为 x86_64 架构构建的。所以,决定放弃聚合的方式,做一个简单的尝试。
-
按照本文中的建议,我将 armv7、armv7s 和 arm64 添加到架构中。
用iphone模拟器(32位)构建静态库项目
用iphone模拟器(64位)构建静态库项目
使用 ios 设备构建静态库项目
转到构建路径(在派生数据下)
将模拟器和设备输出复制到一个公共文件夹中
在终端窗口中使用 lipo 命令创建通用库
lipo 命令:lipo -create -output newlibraryname.a 模拟器库名.a devicelibraryname.a
集成了新创建的通用静态库,它工作了!!!
【讨论】:
在浪费了几个小时试图让 Xcode 编译成通用二进制文件之后,这种“大锤”方法完成了这项工作。只希望我早点尝试过。谢谢!【参考方案3】:在做了很多事情之后,我得到了解决方案。一些 xcode 不知道自动出现 Standard architectures (including 64-bit) (armv7,armv7s,arm64)
,但在我的情况下,我的 静态库项目 中没有选项。所以我要手动添加这个:-
并选择此选项:-
在此之后,我重新构建了我的静态库并在我的项目中使用,现在工作正常。我还用 lipo 命令检查了终端,现在输出会不同:-
testingLibImport/libLibNSlog.a 是:armv7 armv7s i386 x86_64 arm64
【讨论】:
【参考方案4】:很抱歉这么晚才发布另一个解决方案。很久以前,当我试图找到一个解决方案时,我就找到了这个解决方案,该解决方案可以让我在每次必须构建通用库时都使用 lipo 命令创建通用库的手动工作。
所以,这是另一种方法,对于那些使用聚合方法来构建通用库的人
只需在模拟器的聚合脚本中进行如下所述的一项小改动,即可构建通用库 -
xcodebuild -target ProductName -configuration $CONFIGURATION -sdk iphonesimulator ARCHS="i386 x86_64" BUILD_DIR="$BUILD_DIR" BUILD_ROOT="$BUILD_ROOT " SYMROOT="$SYMROOT"
请注意包含多个架构,而不是使用单一架构方法 -
xcodebuild -target ProductName -configuration $CONFIGURATION -sdk iphonesimulator -arch i386 BUILD_DIR="$BUILD_DIR" BUILD_ROOT="$BUILD_ROOT" SYMROOT ="$SYMROOT"
ARCHS="i386 x86_64" 会为您创造奇迹。
您可以使用以下 lipo 命令来确认这一点 lipo -info newLibraryName.a
希望这可以为像我这样的许多人节省时间!!!
【讨论】:
以上是关于如何更新您的静态库架构以支持 arm64 构建?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里可以找到用于 arm64 架构的 openssl iOS 7 libcrypto.a 和 libssl.a 静态库
无法以 64 位模式 (arm64) 构建我的 XCode 项目
如何从iOS中的静态库构建胖库时从libWebRTC.a静态库中删除x86_64 architechture?