zoukankan      html  css  js  c++  java
  • IOS 之 PJSIP 笔记(一) 编译多平台支持的静态库

    好久没有写博客了,这也算是我步入新工作后的第一篇技术博文吧。在进入新公司前,早就有了技术层进入下一个迭代的准备,但很多事情是意想不到的,就像我以 C# 程序员的身份面试入职的,而今却是一个全职的 IOS 开发。从 C# 到 Objective-C 的切换,还是有不少成本的,加上今年又推出了 Swift,以后要学习的路是漫长的,其实,学习的路本身就是漫长的,不应该满足于一个阶段和特定领域。对我而言,语言的切换,已经太常见了,学习一门语言是很容易的事情,但,完全的掌握它,却不是易事,就像去摸清一个陌生人的脾气一样。有点扯远了,还是进入今天的正题吧!

    PJSIP,如果你不知道它是什么,那么说明你无需使用它,那也就没必要继续看我的这篇文章了。由于项目中需要使用到 VOIP,而对比下来,使用 SIP 实现的代价是相对小的,在 Android 里,谷歌内置了对 SIP 的支持,IOS 中就没这么好运了,于是乎找到了 PJSIP,这是一个纯 C 的库,实现的相当漂亮。在网络上找了很久,也没有找到适合我这种的入门级教程,在我的摸索和努力下,终于搞出点名堂来了。那么,恭喜你,你不用走我走过的弯路了。

    下面正式开始,一步步来:

    第一步:下载

    首先,去官网下载源代码,这里推荐下载 .tar.bz2 的包,下载完成后,找到对应的目录,用 tar 或者图形化操作来解压,这里我用命令行的方式来操作:

    $ tar -jxvf pjproject-2.2.1.tar.bz2

    第二步:编译

    首先,要在 pjlib/include/pj/ 目录下,建立一个 config_site.h 的文件,切换到该目录下,用 vi 或者 touch 一个文件:

    $ cd pjlib/include/pj/
    $ vi config_site.h

    按照官方的说明文档,我们文件内容定义如下:

    #define PJ_CONFIG_IPHONE 1
    #include <pj/config_site_sample.h>

    OK,保存,切换回主目录下(也就是有pjlib、pjmedia、pjnath等目录的文件夹),这时候我们就可以编译了,还有个前提,你必须安装了 XCode 的 Command Line Tools(XCode –> Preferences –>Downloads)。

    i386

    首先编译模拟器平台的静态库,依次执行下面这三句:

    $ export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
    $ ARCH="-arch i386" CFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" LDFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" ./configure-iphone
    $ make dep && make clean && make

    OK,没有什么问题的话,你模拟器版本的静态库就编译完成了,它们存在于:

    • pjlib/lib
    • pjlib-util/lib
    • pjmedia/lib
    • pjnath/lib
    • pjsip/lib
    • third_party/lib

    这些,是在以后的 SIP 开发中,必须要使用到的静态库,目前该库只支持模拟器(可使用 lipo –info 命令来查看,只支持 i386),所以,我们将其拷贝出来,当然,我已经为你写好拷贝的脚本了:

    #!/bin/bash
    
    PJLIB_PATH="./lib/$1/pjlib"
    PJLIB_UTIL_PATH="./lib/$1/pjlib-util"
    PJMEDIA_PATH="./lib/$1/pjmedia"
    PJNATH_PATH="./lib/$1/pjnath"
    PJSIP_PATH="./lib/$1/pjsip"
    THIRD_PARTY="./lib/$1/third_party"
    
    echo "start coping to $1"
    
    rm -rf $PJLIB_PATH
    rm -rf $PJLIB_UTIL_PATH
    rm -rf $PJMEDIA_PATH
    rm -rf $PJNATH_PATH
    rm -rf $PJSIP_PATH
    rm -rf $THIRD_PARTY
    
    mkdir -p $PJLIB_PATH
    mkdir -p $PJLIB_UTIL_PATH
    mkdir -p $PJMEDIA_PATH
    mkdir -p $PJNATH_PATH
    mkdir -p $PJSIP_PATH
    mkdir -p $THIRD_PARTY
    
    cp -r ./pjlib/lib/ $PJLIB_PATH
    cp -r ./pjlib-util/lib/ $PJLIB_UTIL_PATH
    cp -r ./pjmedia/lib/ $PJMEDIA_PATH
    cp -r ./pjnath/lib/ $PJNATH_PATH
    cp -r ./pjsip/lib/ $PJSIP_PATH
    cp -r ./third_party/lib/ $THIRD_PARTY
    
    echo "copy done"

    将该脚本保存为 copylibs.sh 存放到主目录下(你应该知道主目录在哪吧!),然后执行:

    $ ./copylibs.sh i386

    如果提示权限不够,那么使用 chmod 777 copylibs.sh 来赋予该文件最大的访问权限,执行完后,所有生成的静态库,都被拷贝到主目录下 lib 目录中的对应位置。

    armv7

    下面继续编译 armv7 版的库,关闭刚刚的那个控制台,注意,是全部关闭后再进入,然后到主目录依次执行下面的命令:

    $ ARCH='-arch armv7' ./configure-iphone
    $ make dep && make clean && make
    $ ./copylibs.sh armv7

    armv7s

    现在编译 armv7s 版本的库,这次不用关闭控制台了,直接依次执行下面的命令(有报错误,但都是示例项目编译出错,和静态链接库文件没关系):

    $ ARCH='-arch armv7s' ./configure-iphone
    $ make dep && make clean && make
    $ ./copylibs.sh armv7s

    arm64

    最后,我们完成 arm64 版本库的编译:

    $ ARCH='-arch arm64' ./configure-iphone
    $ make dep && make clean && make
    $ ./copylibs.sh arm64

    第三步:合并静态链接库

    好了,现在我们需要的库都已经被拷贝到 lib 目录下了,它目前应该是这样的:

    image

    对的,这底下有一个 mix.sh,当然,这也是我为你写好的脚本:

    #!/bin/bash
    
    OUPUT_PATH="./mixed/"
    XLIPO="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo"  
    
    for dir in armv7/*
    do
        LIB_NAME=${dir##*/}
        LIB_OUTPUT=${OUPUT_PATH}$LIB_NAME
    
        rm -rf $LIB_OUTPUT
        mkdir -p $LIB_OUTPUT
    
        for subdir in ${dir}/*
        do
            AFILE=${subdir##*/}
            ARMV7_FILE="./armv7/$LIB_NAME/$AFILE"
            ARMV7S_FILE="./armv7s/$LIB_NAME/$AFILE"
            ARM64_FILE="./arm64/$LIB_NAME/$AFILE"
            I386_FILE="./i386/$LIB_NAME/$AFILE"
            echo "start mixing file: $AFILE"
            
            ${XLIPO} -arch armv7 $ARMV7_FILE -arch armv7s $ARMV7S_FILE -arch arm64 $ARM64_FILE -arch i386 $I386_FILE -create -output ${LIB_OUTPUT}/$AFILE
    
        done
    done
    
    echo "all mixed done"

    将上面的脚本,保存到 lib 目录下 mix.sh 中,控制台中,cd 切换到 lib 目录下,然后执行:

    ./mix.sh 

    OK,现在一切都完成了,在 lib 目录下会多出个 mixed 目录,该目录底下的所有库,都是包含了上诉各种架构版本信息的,可以使用 lipo 来验证下:

    image

    注意,无论是合并还是查看,都要使用 Xcode 下的 lipo,mac 自带的那个 lipo 不支持。

    如果你觉得,亲自动手太麻烦的话,那么这里有一个已经帮你编译好的版本,直接下载使用即可:

    https://github.com/chebur/pjsip

    不过,我还是推荐你自己动手来一遍,自己弄出来的,使用起来才更有意思嘛,呵呵~

    作者:Sun.M
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    纪念这一天,我找到了实习工作
    在编程的道路上坚定地走下去
    今天是1024程序员节
    趣谈函数调用与返回值
    为期3个月的实训结束了,有感而发
    学习编程时遇到难点怎么办?
    今天学习了安卓中的UI线程
    Java程序员要掌握的常用快捷键
    我是一个注重基础的人
    我也有自己的小家啦
  • 原文地址:https://www.cnblogs.com/prinsun/p/build_pjsip_mutil_target_supports.html
Copyright © 2011-2022 走看看