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 目录下了,它目前应该是这样的:

对的,这底下有一个 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 来验证下:

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

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

https://github.com/chebur/pjsip

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

IOS 之 PJSIP 笔记(一) 编译多平台支持的静态库

时间: 2024-10-16 04:33:40

IOS 之 PJSIP 笔记(一) 编译多平台支持的静态库的相关文章

IOS 之 PJSIP 笔记(二) iPJSUA 的简单使用

上一篇在编译完之后,就很不负责的结束了,本篇就对 PJSIP 库中提供的一个示例 iPJSUA 的使用,做一个简单的介绍.也能解除很多人对官方文档的一个困扰,起码我是被困扰过了. 首先,要确保你的 PJSIP 的库和你即将要编译的平台对应,或者你直接使用上一篇博文最后链接下载的库,那样不用做任何配置,因为它相应的 lib 文件夹中的库,都是支持多平台的. 打开位于:pjsip-apps/src/pjsua/ios/ 下的 ipjsua.xcodeproj ,command + r ,运行该项目,

【iOS】编译静态库

与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图sdk),商用库,这两天在研究iOS上编译静态库,这里把编译的过程和中间遇到的一些问题做一下记录,方便以后查阅 objc上的库一般分为两类 静态库: .a 和 .framework .a文件:纯二进制文件,需要配合.h文件一起使用,通过.h文件引用库里面的内容 .framework文件:包含二进制文件

iOS中静态库-.a文件生成和使用

最近在使用使用一个网上的Demo的时候. 出现另一令人烦恼的问题 . 就是它里面有嵌套的工程. 如下图所示. 工程里面还嵌套有一个工程. 真的是让人煞费苦心 …其实这个问题看起来并不是很难, 如果是一般的工程的话, 解决方法有两种: 我可把嵌套工程里面的文件拖拽出来. 修改一些属性什么的应该可以使用了 还有一种方法就是我把嵌套里面的工程整个生成一个静态库文件.把我需要使用的文件的.h暴露出来使用.但是这个工程比较奇葩. 他里面是c++de一些文件. 如果直接拖拽的话会有各种引用文件错误的问题.

[cocos2dx笔记004] android增加静态库工程

(基于2.2.2版本) 这步比较麻烦,不像vs2013那样好设置.参考了很多文章.还是不能解决问题.只有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的mylib这个例子.[cocos2dx笔记003] Vs2013增加静态库工程首先进到external\mylib,用文本编辑器打Android.mk 并修改图中圈中的部分 修改结果如下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :

[cocos2dx笔记004] android添加?静态库project

(基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的mylib这个样例.[cocos2dx笔记003] Vs2013添加?静态库project首先进到external\mylib,用文本编辑器打Android.mk 并改动图中圈中的部分 改动结果例如以下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) L

iOS开发——装逼技术精选&amp;全面了解 iOS 静态库开发

全面了解 iOS 静态库开发 简介 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟.百度地图等第三方的sdk) 静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 静态库和动态库的区别 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统

IOS 静态库 和 动态库

库从本质上市一中可执行的二进制格式,可以被载入内存中执行 iOS 中的静态库有 .a 和 .framework 两种形式;  动态库有  .dylib   和  .framework 两种, 后来 .dylib 被苹果换成 .tbd 的形式 静态库 和 动态库 区别 静态库和动态库是相对于编译期和运行期的,静态库在编译期会被连接到代码中,程序运行期将不再需要改静态库, 而动态库在编译期不会被连接到代码中,只有在程序运行期间才会被载入,所以在程序运行期间还需要动态库的存在. 总结 同一个静态库在不

Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集

最近升级了系统到Mac OS X 10.10 并且更新了XCode6.1和iOS 8.1之前app用到的libmp3lame.a静态库,也要支持64位的模拟器(x86_64)和64位的真机(arm64)指令集.需要重新编译查阅了下资料,按照如下步骤,并做了些注释和改动 1.http://sourceforge.net/projects/lame/files/lame/3.99/ 下载lame的最新版本解压到一个文件夹里例如 lame,全路径如下/Users/8wm/Desktop/lame 2.

iOS开发&gt;学无止境 - 全面了解 iOS 静态库开发

简介 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟.百度地图等第三方的sdk) 静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 静态库和动态库的区别 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省