如何更新您的静态库架构以支持 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 项目

linux查询静态库是arm平台还是x86平台

如何从iOS中的静态库构建胖库时从libWebRTC.a静态库中删除x86_64 architechture?

docker如何构建多架构(arm64, x86_64, armv7)容器镜像?

查看.a 静态库中的.o文件