http://www.cocoachina.com/ios/20150127/11022.html
创建一个静态库工程
点击File\New\Project,选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程.
Xcode的静态库工程不会自动连接到UIKit,在工程导航栏中选择工程名,然后在中央面板中选择Targets RWUIControls ,添加UIKit.framework
添加头文件 Editor\Add Build Phase\Add Headers Build Phase (点击下方Build Phases界面的白色区域来获取Xcode的应用焦点)
RWUIControls.h拖到public下.
在项目导航栏中点击项目名,然后选择RWUIControls静态库目标,选择Build Setting栏,将public header设置为 include/$(PROJECT_NAME)
改变设置:
-
Dead Code Stripping设置为NO
-
Strip Debug Symbol During Copy 全部设置为NO
-
Strip Style设置为Non-Global Symbols
一旦成功,工程导航栏中Product目录下libRWUIControls.a文件将从红色变为黑色,表明现在该文件已经存在了。
创建一个依赖开发(Dependent Development)工程
使用File\New\Project创建一个新的工程,选择iOS\Application\Single View Application,将新工程命名为UIControlDevApp,将类前缀命名为RW,选择该工程只支持iPhone,最后将项目保存到和之前的RWUIControls相同的目录下。
添加RWUIControls依赖库,将RWUIControls.xcodeproj从Finder中拖到Xcode中UIControlDevApp组下。
-
在项目导航栏中选择UIControlDevApp。
-
导航到UIControlDevApp目标下Build Phases面板下。
-
打开Target Dependencies面板,点击+按钮调出选择器。
-
找到RWUIControls静态库,选择并点击Add。这一步表明当构建dev应用时,Xcode会检查是否静态库需要重新构建。
为了连接到静态库本身,展开Link Binary With Libraries面板,再次点击+按钮,从Workspace组中选择libRWUIControls.a然后点击Add。
这一步确保Xcode可以连接到静态库,就像连接到系统framework(例如UIKit)一样。
创建一个Framework
现在你需要在静态库构建过程中添加脚本来创建这种结构,在项目导航栏中选择RWUIControls,然后选择RWUIControls静态库目标,选择Build Phases栏,然后选择Editor/Add Build Phase/Add Run Script Build Phase来添加一个新的脚本。双击面板标题栏Run Script,重命名为Build Framework。
在脚本文本框中粘贴下面的Bash脚本代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
set -e
export FRAMEWORK_LOCN=
"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"
# Create the path to the real Headers die
mkdir -p
"${FRAMEWORK_LOCN}/Versions/A/Headers"
# Create the required symlinks
/bin/ln -sfh A
"${FRAMEWORK_LOCN}/Versions/Current"
/bin/ln -sfh Versions/Current/Headers
"${FRAMEWORK_LOCN}/Headers"
/bin/ln -sfh
"Versions/Current/${PRODUCT_NAME}"
\
"${FRAMEWORK_LOCN}/${PRODUCT_NAME}"
# Copy the public headers into the framework
/bin/cp -a
"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/"
\
"${FRAMEWORK_LOCN}/Versions/A/Headers"
|
在这次构建目录中你可以看到RWUIControls.framework,可以确定一下这里展示了正确的目录结构:
不过你会注意到这里并没有一个静态lib文件
在项目导航栏中选择RWUIControls,然后点击已经存在的目标下面的Add Target按钮。
找到iOS/Other/Aggregate,点击Next,将目标命名为Framework。
在Framework目标下,选择Build Phases栏,点击Editor/Add Build Phase/Add Run Script Build Phase,创建一个新的Run Script Build Phase。
双击Run Script,重命名脚本的名字。这次命名为MultiPlatform Build。
在脚本文本框中粘贴下面的Bash脚本代码:
1
2
3
4
5
6
7
8
9
10
11
|
set -e
# If we're already inside this script then die
if
[ -n
"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS"
]; then
exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1
RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB=
"lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION=
"${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework"
|
接下来,用脚本设置一些函数,这些函数一会项目就会用到,把下面的代码加到脚本的底部。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function
build_static_library {
# Will rebuild the static library as specified
# build_static_library sdk
xcrun xcodebuild -project
"${PROJECT_FILE_PATH}"
\
-target
"${TARGET_NAME}"
\
-configuration
"${CONFIGURATION}"
\
-sdk
"${1}"
\
ONLY_ACTIVE_ARCH=NO \
BUILD_DIR=
"${BUILD_DIR}"
\
OBJROOT=
"${OBJROOT}"
\
BUILD_ROOT=
"${BUILD_ROOT}"
\
SYMROOT=
"${SYMROOT}"
$ACTION
}
function
make_fat_library {
# Will smash 2 static libs together
# make_fat_library in1 in2 out
xcrun lipo -create
"${1}"
"${2}"
-output
"${3}"
}
|
把下面的代码添加到脚本的底部。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if
[[
"$SDK_NAME"
=~ ([A-Za-z]+) ]]; then
RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo
"Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi
# 2 - Extract the version from the SDK
if
[[
"$SDK_NAME"
=~ ([0-9]+.*$) ]]; then
RW_SDK_VERSION=${BASH_REMATCH[1]}
else
echo
"Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi
# 3 - Determine the other platform
if
[
"$RW_SDK_PLATFORM"
==
"iphoneos"
]; then
RW_OTHER_PLATFORM=iphonesimulator
else
RW_OTHER_PLATFORM=iphoneos
fi
# 4 - Find the build directory
if
[[
"$BUILT_PRODUCTS_DIR"
=~ (.*)$RW_SDK_PLATFORM$ ]]; then
RW_OTHER_BUILT_PRODUCTS_DIR=
"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
echo
"Could not find other platform build directory."
exit 1
fi
|
在脚本最后添加下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Build the other platform.
build_static_library
"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"
# If we're currently building for iphonesimulator, then need to rebuild
# to ensure that we get both i386 and x86_64
if
[
"$RW_SDK_PLATFORM"
==
"iphonesimulator"
]; then
build_static_library
"${SDK_NAME}"
fi
# Join the 2 static libs into 1 and push into the .framework
make_fat_library
"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}"
\
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}"
\
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"
|
脚本的最后是简单的拷贝命令,将下面代码添加到脚本最后:
1
2
3
4
5
6
|
# Ensure that the framework is present in both platform's build directories
cp -a
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"
\
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}"
# Copy the framework to the user's desktop
ditto
"${RW_FRAMEWORK_LOCATION}"
"${HOME}/Desktop/${RW_FRAMEWORK_NAME}.framework"
|
检查一下我们的多平台编译真的成功了,启动终端
cd ~/Desktop/RWUIControls.framework
lipo -info RWUIControls