Xcode6 创建 Fat 静态库 iOS 通用框架 [英] Xcode6 Creating Fat Static Library iOS Universal Framework

查看:23
本文介绍了Xcode6 创建 Fat 静态库 iOS 通用框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

自从升级到 Xcode 和 iOS8 后,我在构建胖静态库时遇到了麻烦.有一些很好的说明 这里在这里,但我认为第一条指令的部分内容和所有第二条指令都已过时.第一条说明使用Static iOS Framework,第二条说明使用Cocoa Touch 静态库.在 Xcode6 之前,我会使用 Static iOS Framework,但现在他们已将其重命名为 Cocoa Touch Framework,我不确定.

Since the upgrade to Xcode and iOS8, I've been having trouble building a fat static library. There are some pretty good instructions here and here but I think parts of the first instructions and all of the second instructions are dated. The first instructions say to use Static iOS Framework and the second instructions say to use Cocoa Touch Static Library. Prior to Xcode6, I would use the Static iOS Framework but now that they have renamed it to Cocoa Touch Framework I'm not sure.

那么,对于初学者,我应该使用哪个来创建胖静态库?是 Cocoa Touch 框架 吗?还是 Cocoa Touch 静态库?

So, for starters, which should I use to create a fat static library? Is it Cocoa Touch Framework? Or Cocoa Touch Static Library?

然后我创建一个新的聚合目标:

Then I create a new Aggregate Target:

然后我创建一个运行脚本:

Then I create a Run Script:

这是我正在使用的运行脚本(完整):

Here is the Run Script I am using (in its entirety):

# This script is based on Jacob Van Order's answer on apple dev forums 

https://devforums.apple.com/message/971277
# See also http://spin.atomicobject.com/2011/12/13/building-a-universal-framework-for-ios/ for the start


# To get this to work with a Xcode 6 Cocoa Touch Framework, create Framework
# Then create a new Aggregate Target. Throw this script into a Build Script Phrase on the Aggregate


######################
# Options
######################

REVEAL_ARCHIVE_IN_FINDER=true

FRAMEWORK_NAME="${PROJECT_NAME}"

SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"

DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"

UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"

FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"


######################
# Build Frameworks
######################

xcodebuild -project ${PROJECT_NAME}.xcodeproj -sdk iphonesimulator -target ${PROJECT_NAME} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator | echo

xcodebuild -project ${PROJECT_NAME}.xcodeproj -sdk iphoneos -target ${PROJECT_NAME} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos | echo

#xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" | echo

#xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" | echo


######################
# Create directory for universal
######################

rm -rf "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${FRAMEWORK}"


######################
# Copy files Framework
######################

cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}"


######################
# Make fat universal binary
######################

lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo


######################
# On Release, copy the result to desktop folder
######################

if [ "${CONFIGURATION}" == "Release" ]; then
mkdir "${HOME}/Desktop/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/"
cp -r "${FRAMEWORK}" "${HOME}/Desktop/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/"
fi


######################
# If needed, open the Framework folder
######################

if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then
if [ "${CONFIGURATION}" == "Release" ]; then
open "${HOME}/Desktop/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/"
else
open "${UNIVERSAL_LIBRARY_DIR}/"
fi
fi

但是当我尝试构建时,我收到了这条消息:

But when I try to Build I receive this message:

fatal error: lipo: can't open input file: /Users/pdl/Library/Developer/Xcode/DerivedData/innerIDMobileLicense-blnxjfvoxnqfelftmzojgdwhvazk/Build/Products/Debug-iphonesimulator/innerIDMobileLicense.framework/innerIDMobileLicense (No such file or directory)

没错,文件不存在!请注意,在下面的第一张图片中,有一个 Unix 可执行文件 IdAirOpenCv.然后查看第二张图片,发现 IdAirOpenCv 不存在.

That's correct, the file isn't there! Notice in the first image below, there is a Unix Executable File IdAirOpenCv. Then look at the second image and notice that IdAirOpenCv isn't there.

这是我在升级之前经常看到的:

This is what I am used to seeing prior to upgrading:

这就是我现在拥有的:

根据脚本,Unix 可执行文件 innerIDMobileLicense 应位于所有三个框架文件夹中,与 Headers 和 Modules 文件夹处于同一级别.

According to the script, the Unix Executable File innerIDMobileLicense should be located inside all three of the framework folders at the same level as the Headers and Modules folders.

有人知道我做错了什么吗?

Does anybody have a clue what I am doing wrong?

推荐答案

致命错误:lipo:无法打开输入文件:/Users/pdl/Library/Developer/Xcode/DerivedData/innerIDMobileLicense-blnxjfvoxnqfelftmzojgdwhvazk/Build/Products/Debug-iphonesimulator/innerIDMobileLicense.framework/innerIDMobileLicense(没有这样的文件或目录)

fatal error: lipo: can't open input file: /Users/pdl/Library/Developer/Xcode/DerivedData/innerIDMobileLicense-blnxjfvoxnqfelftmzojgdwhvazk/Build/Products/Debug-iphonesimulator/innerIDMobileLicense.framework/innerIDMobileLicense (No such file or directory)

你得到的这个 lipo 错误很可能是由于包含的目录不存在.

This lipo error you got is most likely due to the containing directory does not exists.

脚本是在 xcode 没有框架项目时创建的.

The script is created when xcode does not have a framework project.

Lipo 基本上将用于不同架构的两个二进制构建链接在一起以构建一个胖的.

Lipo basically links two binary build for different architecture together to build a fat one.

那么,对于初学者,我应该使用哪个来创建胖静态库?是 Cocoa Touch 框架吗?还是 Cocoa Touch 静态库?

So, for starters, which should I use to create a fat static library? Is it Cocoa Touch Framework? Or Cocoa Touch Static Library?

任何一个都可以.Lipo 可以链接框架内部的二进制文件和一个简单的静态库

Either one will work. Lipo can link the binary inside the framework and a simple static library

我所做的是创建一个静态库项目和一个框架项目.将静态库目标设置为设备或模拟器(使用 sdk iphoneos 或 iphonesimulator.将 Universal Framework 脚本添加到框架项目中,以使用其他 sdk 构建静态库,并将 fat 二进制文件放入框架.还将所需的头文件复制到框架项目.框架不需要编译任何东西.

What I did is to create a static library project, and a framework project. Set the static library target to be either device or simulator (using sdk iphoneos or iphonesimulator. Add the Universal Framework script into the framework project to build the static library with the other sdk and put the fat binary to the framework. Also copy needed headers to the framework project. The framework do not need to compile anything.

这篇关于Xcode6 创建 Fat 静态库 iOS 通用框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆