您的位置:首页 > 移动开发 > IOS开发

把C程序编译成IOS SDK

2015-09-18 15:30 567 查看
最近在公司从事SDK相关的开发工作,开始的时候自己也是一头雾水,因为公司之前没有相关的案例,网上也找不到相关的资料,有的也只是Xcode编译SDK的一些配置,所以只能自己慢慢摸索,由于公司的项目需要用到第三方的库PJSIP,这个库是开源的,而且支持多平台,我分析它的编译方式,终于找到了一个适合的方法,解决了第一个大问题-SDK编译。

需求

项目要求把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就可以编译了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: