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流的實驗,敬請關注.