【问题标题】:How to update our static library architecture for suporting arm64 Build?如何更新您的静态库架构以支持 arm64 构建?
【发布时间】: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:仍然遇到同样的问题


所以,我的问题是更新 的 lib 是否需要任何额外的更改,或者我在上述步骤中犯了任何错误。如果我错了,请告诉我。

更新我的静态库以支持 64Bit architecture 需要进行哪些更改

注意:

我要求我自己创建的库更新。我没有使用第三方库。 更新

我在终端中使用了这个lipo -info testingLibImport/libLibNSlog.a 命令,输出为:

Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64 

【问题讨论】:

标签: arm64 ios ios7 static-libraries arm64 xcode5.1


【解决方案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”:数据库被锁定可能有两个并发在同一文件系统位置运行的构建。
【解决方案2】:

我昨天也遇到了同样的问题,经过大量谷歌搜索并尝试了不同的解决方案后,我放弃了自己尝试。从提供的不同解决方案中我所能理解的是,当我运行“lipo -info library.a”时,它不是为 x86_64 架构构建的。所以,决定放弃聚合的方式,做一个简单的尝试。

  1. 按照本文中的建议,我将 armv7、armv7s 和 arm64 添加到架构中。
  2. 用iphone模拟器(32位)构建静态库项目
  3. 用iphone模拟器(64位)构建静态库项目
  4. 使用 iOS 设备构建静态库项目
  5. 转到构建路径(在派生数据下)
  6. 将模拟器和设备输出复制到一个公共文件夹中
  7. 在终端窗口中使用 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

    希望这可以为像我这样的许多人节省时间!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2015-08-06
      • 2013-12-30
      • 2016-06-08
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多