live555學習(一)編譯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流的實驗,敬請關注.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章