WebRTC源代码探索之旅——多线程篇(7 - 1)
来源:互联网 发布:数据库流程图怎么画 编辑:程序博客网 时间:2024/06/05 07:47
7 实际使用WebRTC的线程模型
在这一章节我将实际演示如何将WebRTC的/trunk/talk/base目录下的所有文件编译成静态库。并且在这基础上编译运行2个小程序,以观察整个线程模型的调用关系。这将能够很好地帮助读者理解各个模块是如何协同工作的。
7.1 编译静态库
正如在本文开头时提到的,这一节的内容可能是大家最感兴趣的,但也是我不得不和大家说声抱歉的,我是在Mac OSX平台上完成了对WebRTC的/trunk/talk/base目录下的源代码的编译。所以编译脚本只能在Mac OSX下使用,不过我相信向Linux和Windows移植的工作应该不会很困难。因为:
1 WebRTC本身就是跨平台编写的,它本身就支持所有的平台;
2 谷歌已经为WebRTC编写了完美的编译脚本,这种脚本以python为基础可以在各个平台上使用命令行编译或者生成IDE(包括Visual Studio)工程脚本。特别要提一下的是谷歌使用的ninjia实在太强大了,编译速度超快无比,推荐使用;
3 我所使用的脚本并不复杂,所以通过简单修改应该可以在各个平台上使用;
基于以上的原因,可能大家会觉得我自己写编译脚本有些多此一举。从理论上来说确实有些多此一举,但是我也有我自己的理由:
1 最近为了找工作所以学习了一些关于make脚本的知识,这次正好用来练手。其实在以前的工作中使用过nmake,不过主体框架是美国同事写得,我们不过是在添加删除文件时维护一下。所以,这次学习WebRTC源代码可以有机会在实践中检验一下对make脚本的理解。
2 我希望将/trunk/talk/base目录独立编译出来,这样可以将它作为独立的模块进行试验,避免被其他模块干扰。
言归正题,让我们先来看一下编译脚本:
- .PHONY = all create_dir clean
- CC := g++
- COCOACC := g++
- AR := ar
- ut_srcs := $(wildcard *_unittest.cc)
- exclusive_files := $(ut_srcs) \
- diskcache_win32.ccjson.cc linuxwindowpicker.cc \
- macsocketserver.ccnatserver_main.cc schanneladapter.cc \
- sslidentity.ccunittest_main.cc win32.cc win32filesystem.cc \
- win32regkey.ccwin32securityerrors.cc win32socketserver.cc \
- win32window.ccwin32windowpicker.cc winfirewall.cc winping.cc
- proj_dir := ../..
- obj_dir := $(proj_dir)/bin/talk_base
- all_srcs := $(wildcard *.cc)
- srcs := $(filter-out $(exclusive_files),$(all_srcs))
- objs := $(patsubst %.cc, %.o, $(srcs))
- fp_objs := $(addprefix $(obj_dir)/,$(objs))
- cocoa_srcs := scoped_autorelease_pool.mm maccocoathreadhelper.mm
- cocoa_objs := $(patsubst %.mm, %.o,$(cocoa_srcs))
- fp_cocoa_objs := $(addprefix $(obj_dir)/,$(cocoa_objs))
- CCFLAGS := -DPOSIX -DOSX -I$(proj_dir) -g
- COCOACCFLAGS := -DOSX -I$(proj_dir) -g
- ARFlAGS := crv
- all: create_dir $(fp_objs) $(fp_cocoa_objs)
- $(AR)$(ARFlAGS) $(obj_dir)/libtalkbase.a $(fp_objs) $(fp_cocoa_objs)
- $(fp_objs): $(obj_dir)/%.o: %.cc
- $(CC)$(CCFLAGS) -o $@ -c $^
- $(fp_cocoa_objs): $(obj_dir)/%.o: %.mm
- $(COCOACC)$(COCOACCFLAGS) -o $@ -c $^
- create_dir:
- mkdir-p $(obj_dir)
- clean:
- rm-rf $(obj_dir)
对于使用惯Visual Studio的Windows开发人员来说,make脚本确实有些晦涩,不过以上脚本并不是很难。由于初次编写make脚本,所以特意避开了一些复杂的技巧,并且尽可能不考虑编译环境的通用性。比如,通常make脚本需要生成依赖文件(*.d),由于当前只是为了编译确定版本的WebRTC代码(代码不会发生变化),所以我省略了这一步。
整个make脚本的大致就是先把所有的代码文件(*.cc)罗列出来,然后去除掉unit test文件,以及一些Windows平台下特有的文件。将余下的文件使用g++编译成目标文件(*.o)。由于我使用的是Mac OSX平台,所以需要特别编译几个Mac OSX的代码文件(*.mm)文件。最后使用ar工具将所有的目标文件(*.o)打包成静态库(libtalkbase.a)。整个过程并没有什么特别的。不过,由于初次编写make脚本,有些地方并不是很规范(比如变量名的使用),请各位读者见谅。
- WebRTC源代码探索之旅——多线程篇-7
- WebRTC源代码探索之旅——多线程篇-1
- WebRTC源代码探索之旅——多线程篇(7 - 1)
- WebRTC源代码探索之旅——多线程篇(7 - 1)
- WebRTC源代码探索之旅——多线程篇-2
- WebRTC源代码探索之旅——多线程篇-3
- WebRTC源代码探索之旅——多线程篇-4
- WebRTC源代码探索之旅——多线程篇-5.1
- WebRTC源代码探索之旅——多线程篇-6
- WebRTC源代码探索之旅——多线程篇-8
- WebRTC源代码探索之旅——多线程篇(7 - 2)
- WebRTC源代码探索之旅——多线程篇(7 - 3)
- WebRTC源代码探索之旅——多线程篇(7 - 3)
- WebRTC源代码探索之旅——多线程篇(1)
- WebRTC源代码探索之旅——多线程篇(4 - 1)
- WebRTC源代码探索之旅——多线程篇(5 - 1)
- WebRTC源代码探索之旅——多线程篇(6 - 1)
- WebRTC源代码探索之旅——多线程篇(1)
- WebRTC源代码探索之旅——多线程篇(5 - 4)
- java从入门到精髓 - Swing表格JTable利用tableModel添加行修改行删除行
- WebRTC源代码探索之旅——多线程篇(6 - 1)
- Gradle 教程说明 用户指南 1~6章
- 压缩感知中的数学知识:线性方程组的解
- WebRTC源代码探索之旅——多线程篇(7 - 1)
- Facebook将从明年执行新隐私政策
- WebRTC源代码探索之旅——多线程篇(7 - 3)
- WebRTC源代码探索之旅——多线程篇(8)
- 如何使用 LotusScript 代理来发送 HTML 格式的邮件
- 2014.11.28中午
- IOS学习 深入浅出Cocoa之动态创建类
- FLV文件格式解析
- 如何为IOS应用建立清晰易懂的项目目录结构