Xcode6创建胖静态库iOS通用框架

时间:2014-12-04 00:25:12

标签: objective-c frameworks xcode6 static-libraries

自从升级到Xcode和iOS8以来,我一直无法构建胖静态库。有一些非常好的说明herehere,但我认为第一条指令的部分内容和所有第二条指令都已过时。第一条说明是使用静态iOS框架,第二条说明是使用 Cocoa Touch静态库。在Xcode6之前,我会使用静态iOS框架,但现在他们已将其重命名为 Cocoa Touch Framework 我不确定。

那么,对于初学者,我应该用它来创建胖静态库?它是 Cocoa Touch Framework 吗?或者 Cocoa Touch静态库

Cocoa Touch Framework

Cocoa Touch Static Library

然后我创建一个新的Aggregate Target:

Aggregate Target

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


Run Script


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

# 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

但是当我尝试构建时,我会收到此消息:

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 不在那里。

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

Old folder structure

这就是我现在所拥有的:

New folder structure

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

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

  

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

你得到的这个lipo错误很可能是因为包含目录不存在。

当xcode没有框架项目时,会创建脚本。

Lipo基本上将两个不同体系结构的二进制构建链接在一起构建一个胖子。

  

那么,对于初学者来说,我应该用它来创建一个胖的静态库?   它是Cocoa Touch Framework吗?还是可可触摸静态库?

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

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