zoukankan      html  css  js  c++  java
  • live555学习(一)通读Makefile编译live555

    live555学习(一)通读Makefile编译live555

     live555 编译live555 学习开源


    前言

    拿到一份开源代码,我们应该怎么学习呢,第一次接触的时候面对海量的源码,会有种找不着北的感觉吧。这里我会写下自己的学习过程,以及学习中遇到的那些问题一一记录下来,望对初学会有所帮助。

    学习开源代码,我认同一种说法,“竟可能在代码内找答案,而不是在代码外找答案”因为你看到那篇文章的时候有可能已经过时了,以至于不精确.其次他人对整个项目的掌握程度你并不清楚,你并不一定能完全理解他人的文章,怎么说也都是他人的东西,并不是说你读了,就能成为你的东西。

    学习一个项目,我认为最快捷了解整个项目的方法就是去看它的Makefile文件,工程目录的Makefile定义了整个项目的整合规则,而各个目录下的Makefile文件则是定义了这个模块的编译规则。本文将通读Live555的Makefile文件,先来了解live555有分别有哪些模块,编译生成了些什么。

    live555简介

    live555是最重量级的一个C++流媒体开源项目,其中不仅包括了传输协议(SIP、RTP)、音视频编码器(H.264、MPEG4)等,还包括流媒体服务器的例子,是流媒体项目的首选,里面的传输模块是非常值得视频会议开发作为参考的。

    下载live555

    下载源代码:http://www.live555.com/liveMedia/public/选择live555-x.tar.gz下载。

    live的编译

    生成Makefile

    解压完源代码,我们可以并没看到源代码下有Makefile文件吧,这是因为live555是可多种平台编译的,所以编译前肯定要根据平台不同做不不同的配置吧,我们先找找配置文件。可以看到根目录下很多config.xxx文件,打开一看也确实像是配置文件,还有makefile.head、makefile.tail、genMakefile文件不妨都打开来看一看.

    打开genMakefile

    1.#!/bin/sh
    2.
    3.usage() {
    4. echo "Usage: $0 <os-platform>"
    5. exit 1
    6.}
    7.
    8.if [ $# -ne 1 ]
    9.then
    10. usage $*
    11.fi
    12.
    13.platform=$1
    14.subdirs="liveMedia groupsock UsageEnvironment BasicUsageEnvironment testProgs mediaServer proxyServer"
    15.
    16.for subdir in $subdirs
    17.do
    18. /bin/rm -f $subdir/Makefile
    19. cat $subdir/Makefile.head config.$platform $subdir/Makefile.tail > $subdir/Makefile
    20. chmod a-w $subdir/Makefile
    21.done
    22.
    23./bin/rm -f Makefile
    24.cat Makefile.head config.$1 Makefile.tail > Makefile
    25.chmod a-w Makefile

    platform=$1

    这是一个shell脚本,可以看到platform = 我们输入的第一个参数,即选择平台。

    cat $subdir/Makefile.head config.$platform $subdir/Makefile.tail > $subdir/Makefile

    可以看到这个shell脚本会先进入各个子目录把Makefile.head config.$platform Makefile.tail 三个文件合成Makefile文件. 
    然后再在根目录合成Makefile文件.这下就清晰了Makefile怎么生成的了。

    Make的生成目标

    ./genMakefile linux制作好Makefile后,打开根目录下的Makefile查找它的生成目标。

    1.all:
    2. cd $(LIVEMEDIA_DIR) ; $(MAKE)
    3. cd $(GROUPSOCK_DIR) ; $(MAKE)
    4. cd $(USAGE_ENVIRONMENT_DIR) ; $(MAKE)
    5. cd $(BASIC_USAGE_ENVIRONMENT_DIR) ; $(MAKE)
    6.
    7. cd $(TESTPROGS_DIR) ; $(MAKE)
    8. cd $(MEDIA_SERVER_DIR) ; $(MAKE)
    9. cd $(PROXY_SERVER_DIR) ; $(MAKE)

    我们先看第一个目标目录LiveMedia下的Makefile

    1.LIB_SUFFIX = a
    2.
    3.##### End of variables to change
    4.
    5.NAME = libliveMedia
    6.LIVEMEDIA_LIB = $(NAME).$(LIB_SUFFIX)
    7.ALL = $(LIVEMEDIA_LIB)
    8.all: $(ALL)
    9.
    10..$(C).$(OBJ):
    11. $(C_COMPILER) -c $(C_FLAGS) $<
    12..$(CPP).$(OBJ):
    13. $(CPLUSPLUS_COMPILER) -c $(CPLUSPLUS_FLAGS) $<

    可以看到该目录编译的目标 是libliveMedia.a 静态库. 
    先编译一下,看看是不是这样. 
    make 编译live555.

    1.root@ubuntu:/OpenSrc/live# find -name "*.a"
    2../groupsock/libgroupsock.a
    3../liveMedia/libliveMedia.a
    4../BasicUsageEnvironment/libBasicUsageEnvironment.a
    5../UsageEnvironment/libUsageEnvironment.a

    可以看到本次编译共生成了4个静态库,正好是前4个编译的目标.

    再看看后面三个目标 
    TESTPROG目录下的Makefile是这样子的.

    1.MULTICAST_APPS = $(MULTICAST_STREAMER_APPS)
    2.UNICAST_APPS = $(UNICAST_STREAMER_APPS)
    3.MISC_APPS = testMPEG1or2Splitter$(EXE)
    4.
    5.ALL = $(MULTICAST_APPS) $(UNICAST_APPS) $(MISC_APPS)
    6.all: $(ALL)
    7.
    8.extra: testGSMStreamer$(EXE)
    9.
    10..$(C).$(OBJ):
    11. $(C_COMPILER) -c $(C_FLAGS) $<
    12..$(CPP).$(OBJ):
    13. $(CPLUSPLUS_COMPILER) -c $(CPLUSPLUS_FLAGS) $<

    根据名字,可以先猜测TestPROG编译的目标应该是一些测试用的应用程序.

    1.PROXY_SERVER = live555ProxyServer$(EXE)
    2.MEDIA_SERVER = live555MediaServer$(EXE)

    同时可以看到另外两个目标也是应用, 这样整个Live默认配置下,编译生成的那些东西就清楚了:4个静态库3个应用

    本文至此已经结束了,经过通读Makefile,我们已经知道了live555项目的目录状况.但是这些模块分别是干什么用的呢,我现在也不知道,可以先通过名字猜猜意思吧,下篇文章,将通过使用live555自带的例程和VLC,做一个用rtsp流的实验,敬请关注.

  • 相关阅读:
    显示当前时间和全班学生成绩求和
    js做计算器
    javascript学习内容--改变样式、取消设置、显示内容、隐藏内容
    javascript学习内容--object.style.display="value" value值为“”none“隐藏”或 "block"显示
    元素示例
    Python网页爬虫(一)
    macbook Android开发环境搭建,真机调试
    Shell 脚本编程笔记(一) Hello Shell
    嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
    算法学习(二) 全排列问题的非递归算法——模拟堆栈
  • 原文地址:https://www.cnblogs.com/ailumiyana/p/8953045.html
Copyright © 2011-2022 走看看