把C程序编译成IOS SDK
2015-09-18 15:30
567 查看
最近在公司从事SDK相关的开发工作,开始的时候自己也是一头雾水,因为公司之前没有相关的案例,网上也找不到相关的资料,有的也只是Xcode编译SDK的一些配置,所以只能自己慢慢摸索,由于公司的项目需要用到第三方的库PJSIP,这个库是开源的,而且支持多平台,我分析它的编译方式,终于找到了一个适合的方法,解决了第一个大问题-SDK编译。
如,以QQ SDK为例:
set_ios_arm7_env() {
// 真机 DEVPATH=/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
// 这些都是C makefile的一些配置
CFLAGS=”-O2 -Wno-unused-label”
LDFLAGS=”-O2”
// 交叉编译路径 TCPATH=”DEVPATH/../../../Toolchains/XcodeDefault.xctoolchain”ccpath=”{DEVPATH}/../../../Toolchains/XcodeDefault.xctoolchain”
ccpath=”{TCPATH}/usr/bin/clang”
}
// 配置arm64
set_ios_arm64_env() {
ARCH=”-arch arm64”
set_ios_arm7_env
}
另外,i386和x86_64,一些基本的配置都和上面类似,这里就不贴代码了,有2点不同的地方:
这里用的时模拟器的SDK,把DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer设置成这样就可以。
需要制定最低版本信息:
CFLAGS=”-O2 -m32 -mios-simulator-version-min=5.0”
LDFLAGS=”-O2 -m32 -mios-simulator-version-min=5.0”
需求
项目要求把C程序编译成对应平台的SDK,然后再SDK的基础上进行开发应用,开始的思路比较简单,直接把代码拖到Xcode中进行编译,但是和经理讨论后发现这样扩展性不强,因为公司还有安卓平台,公司希望能够把底层代码和应用层分开,所以SDK封装一定要实现。目标
在我的上一篇博客中有介绍IOS SDK相关的基础信息,总的来说,要适配模拟器和真机,就要实现SDK支持armv7,arm64,i386,x86_64 4个平台,再MAC命令行下,我们可以通过lipo 查看SDK信息:如,以QQ SDK为例:
实现
“`set_ios_arm7_env() {
// 真机 DEVPATH=/Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
[ ! -d "$DEVPATH" ] && cecho "Please set ios DEVPATH first!" red && exit 1 // 选择SDK版本,一般调用最新的 if test "$IPHONESDK" = ""; then # If IPHONESDK is not set, use the latest one for f in `ls $DEVPATH/SDKs/`; do echo $f | sed 's/\(.sdk\)//'; done | sort | tail -1 > tmpsdkname IPHONESDK=`cat tmpsdkname`.sdk rm -f tmpsdkname SDKPATH=${DEVPATH}/SDKs/${IPHONESDK} echo "$F: IPHONESDK is not specified, choosing ${IPHONESDK}" elif test -d ${IPHONESDK}; then # .. else if IPHONESDK is set and it points to a valid path, just use it SDKPATH=${IPHONESDK} else # .. else assume the SDK name is used. SDKPATH=${DEVPATH}/SDKs/${IPHONESDK} fi // 在arm64和armv7都是真机环境,所以只有ARCH不一样,其他配置一样 if test "${ARCH}" = ""; then export ARCH="-arch armv7" fi
// 这些都是C makefile的一些配置
CFLAGS=”-O2 -Wno-unused-label”
LDFLAGS=”-O2”
// 交叉编译路径 TCPATH=”DEVPATH/../../../Toolchains/XcodeDefault.xctoolchain”ccpath=”{DEVPATH}/../../../Toolchains/XcodeDefault.xctoolchain”
ccpath=”{TCPATH}/usr/bin/clang”
export CC="${ccpath}" export CFLAGS="${CFLAGS} -DPJ_SDK_NAME=\"\\\"`basename $SDKPATH`\\\"\" ${ARCH} -isysroot ${SDKPATH} -I${DBUILD_OUT_INC_DIR} -I${dsrc_root_dir} -Wall -fPIC $CFLAGS_PARA" # 如果你的代码中调用了IOS SDK,可以配置这个选项 export LDFLAGS="${LDFLAGS} ${ARCH} -isysroot ${SDKPATH} -framework AudioToolbox -framework Foundation" export AR="${TCPATH}/usr/bin/libtool -static -o" export AR_FLAGS=" " export RANLIB="echo ranlib" export CPP="${CC} ${ARCH} -E -isysroot ${SDKPATH}"
}
// 配置arm64
set_ios_arm64_env() {
ARCH=”-arch arm64”
set_ios_arm7_env
}
另外,i386和x86_64,一些基本的配置都和上面类似,这里就不贴代码了,有2点不同的地方:
这里用的时模拟器的SDK,把DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer设置成这样就可以。
需要制定最低版本信息:
CFLAGS=”-O2 -m32 -mios-simulator-version-min=5.0”
LDFLAGS=”-O2 -m32 -mios-simulator-version-min=5.0”
说明
如果你们写好了makefile,只需要先执行我上面的脚本,然后执行make就可以编译了。相关文章推荐
- ios9适配,编译报错修改
- 查看iOS模拟器应用的沙箱文件
- iOS项目更新之升级Xcode7 & iOS9 包括Xcode7在iOS9上测试时出现的一些问题
- IOS开发之消息推送(APNS)
- pch文件的创建和使用
- iOS项目更新之升级Xcode7 & iOS9
- ios开发日记 10- CGPathAddArc和CGPathAddArcToPoint函数
- ios开发日记10 - 使用CAShapLayer绘制扇形
- 关于适配iOS9.0 问题 报错解决
- 工欲利其事必先利其器之iOS开发前期准备
- 计算文本的高度并显示在label上出现灰色的线条
- iOS Xcode7 修改了info.plist 也不能联网问题
- iOS中Bitcode的介绍及配置
- 史上最全iOS代码汇总
- 招聘一个靠谱的 iOS
- iOS中的定时器实现图片的轮播
- iOS 技术分享4
- iOS html中嵌入图片适应手机屏幕大小
- IOS navigationController.popToViewController的使用
- NSNotificationCenter消息推送