20

几天前,我创建了可以正常工作的静态库(通用)Xcode5.0 SDK7。如果我选择模拟器,则更新Xcode5.1SDK7.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 
4

4 回答 4

14

我在 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}/"
于 2015-07-02T09:50:24.170 回答
10

昨天我也遇到了同样的问题,经过大量谷歌搜索和尝试不同的解决方案后,我放弃了自己尝试。从提供的不同解决方案中我所能理解的是,当我运行“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 设备库名.a

集成了新创建的通用静态库,它工作了!!!

于 2014-10-15T12:20:53.263 回答
9

经过很多东西我得到了解决方案。一些 xcode 不知道有自动出现,但在我的情况下,我的静态库项目Standard architectures (including 64-bit) (armv7,armv7s,arm64)中没有选项。所以我要手动添加这个: -

在此处输入图像描述

并选择此选项:-

在此处输入图像描述

在此之后,我重新构建了我的静态库并在我的项目中使用,现在工作正常。我还用 lipo 命令检查了终端,现在输出会不同:-

testingLibImport/libLibNSlog.a 是:armv7 armv7s i386 x86_64 arm64

于 2014-03-13T13:13:33.597 回答
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来确认这一点

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

于 2014-12-14T15:02:14.737 回答