频道栏目
首页 > 资讯 > 其他 > 正文

移动开发创建第一个库实践教程

17-11-06        来源:[db:作者]  
收藏   我要投稿

移动开发创建第一个库实践教程,由于公司业务需要,希望把原来直接加入到工程中的C++代码封装成库,供第三方使用。在这里做个总结:

创建动态库还是静态库
我们知道静态库的目的是对功能的封装,静态库中的函数是要通过静态链接器跟工程源码链接在一起形成最终的可执行文件。而动态链接库的向我们的应用提供了一种调用外部代码的方式,使得我们的应用在链接的时候只需要“接入”动态链接库的地址而非源码,这样减小了应用的体积。但是由于苹果的沙箱机制,iOS App无法直接调用除系统之外的沙箱外部的代码,所以我们在XCode中虽然创建的是动态库,实际上是静态库的效果。Framework帮我们将头文件、可执行文件、资源文件等封装在了一起,是苹果推荐的方式。
静态库和动态库 如何打包
通过XCode只能一次编译模拟器版本或者真机版本,无法同时编译两个版本。我们可以创建一个聚合target,并为之添加脚本,来解决需要分别编译并手动合并两个版本的麻烦。
这里写图片描述 为库增加bitcode
在模拟器运行以及真机环境执行时,都不会真正编译带有bitcode的中间代码。只有在打包(Archieve)时才会编译出bitcode中间代码。
3.1. 如果是通过XCode直接打包的话,需要做三个修改:
(1) 将库工程的BitCode Enabled 设置为YES。
(2)将-fembed-bitcode添加到Other C flags中。
(3)将-fembed-bitcode添加到Other linker flags中。
做完这三项才能打出含有bitcode的库。
3.2. 如果是通过脚本打包,则需要在xcodebuild命令中增加OTHER_CFLAGS=”-fembed-bitcode”参数。
3.3. 如何检查打出的包是否已包含bitcode。通过目标文件显示工具otool(object file displaying tool),如果其中包含LLVM的内容,就可以认为包含了bitcode。
这里写图片描述
PS:如果是针对静态库.a的话,要检查的是是否包含bitcode,命令是:otool -arch armv7 -l xxx | grep bitcode | wc -l 打包脚本(网上找的,暂时运行良好)

# Sets the target folders and the final framework product.
如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
\# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
\# Install dir will be the final output to the framework.
\# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
\# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
\# -configuration ${CONFIGURATION}
\# Clean and Building both architectures.
xcodebuild -configuration "Release" OTHER_CFLAGS="-fembed-bitcode" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" OTHER_CFLAGS="-fembed-bitcode" -target "${FMK_NAME}" -sdk iphonesimulator clean build
\# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
\# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"

存疑

存疑1:关于Mach-O Type的问题,默认是dynamic-Library,生成的.framework中包含可执行文件,看着跟其他第三方库中包含的是文稿类型的文件,不太一样,有些担心审核被拒。但是如果将其改为static-Library的话,脚本编译报错,无法正确生成framwork。

相关TAG标签
上一篇:数据结构C语言基本概念
下一篇:基于Unity3D的异步加载场景的实现方案
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站