1. 程式人生 > >rtplib在linux上的編譯安裝

rtplib在linux上的編譯安裝


JRTPlib簡介
http://www.tekuba.net/program/10/中提到過RTP的例程,這裡參考網路上的資料給出JRtpLIB的嵌入式arm環境以及桌面環境開發環境的建立。
  RTP 是目前解決流媒體實時傳輸問題的最好辦法,要在 Linux 平臺上進行實時傳送程式設計,可以考慮使用一些開放原始碼的 RTP 庫,如 LIBRTP、JRTPLIB 等。JRTPLIB 是一個面向物件的 RTP 庫,它完全遵循 RFC1889設計,在很多場合下是一個非常不錯的選擇。JRTPLIB 是一個用 C++ 語言實現的 RTP 庫,這個庫使用Socket 機制實現網路通訊 因此可以執行在 Windows、Linux、FreeBSD、Solaris、Unix和VxWorks 等多種作業系統上。
一,x86版本JRTPLIB的編譯
來源:

http://www.cnblogs.com/fengqing888/archive/2011/08/16/2140464.html
1. 下載開發包解壓。分別下載jrtplib-3.7.1.tar.gz和jthread-1.2.1.tar.gz。
下載地址為:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.7.1.tar.gz
                      http://research.edm.uhasselt.be/jori/jthread/jthread-1.2.1.tar.gz
這裡用到的軟體包在115上都有。
2. 將原始檔放到如下任意目錄中,這裡假設放到主目錄下:/home/nick/。分別解壓#tar -xzvf xxx,xxx為檔名。解壓後出現兩個目錄,一個是jrtplib-3.7.1,一個是jthread-1.2.1。然後進行安裝,先安裝jthread,再安裝jrtplib。
3. jthread安裝:
       進入jthead解壓目錄,執行#./configure配置環境,如果出現permission denied,說明我們需要給檔案configure執行的許可權,執行#chmod a+x configure即可。配置完畢後執行#make,成功後再執行#make install。安裝成功以後會在/urs/local/include目錄下多出一個資料夾jthread。
4. jrtplib安裝同上,全部安裝好以後會在/urs/local/include目錄下多出兩個資料夾jrtplib3(可能由於版本不同,生成的資料夾名字略有不同,比如叫jrtplib-3.7.1)和jthead。複製jthead下所有檔案(都是字尾為.h的標頭檔案)到jrtplib資料夾下,目的是為了讓所有標頭檔案在一個目錄下方便呼叫。
注意:我在編譯jrtplib的時候出現如下錯誤:
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225:36: error: 'snprintf' was not declared in this scope
make[1]: *** [rtperrors.lo] 錯誤 1
make[1]:正在離開目錄 `/root/vedio/JRTPLib/src-x86/jrtplib-3.7.1/src'
make: *** [all-recursive] 錯誤 1
下面是解決辦法:來源
http://www.cnblogs.com/my_life/articles/1953131.html

在 Fedora 13 中 make 提示的錯誤:
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225: error: 'snprintf' was not declared in this scope
為了 make 成功,需要修改 jrtplib-3.7.1 原始檔 rtpdefines.h
新增如下語句 :
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
5. 裝好以後系統環境如下,靜態動態庫安裝到了/usr/local/lib目錄下,包括libjrtplib-3.7.1.so和libjthread-1.2.1.so等。標頭檔案在/usr/local/include/jrtplib-3.7.1目錄下。
6. 在jrtplib原始碼目錄裡有示例程式,在目錄example下,試驗一下編譯example1.cpp(先刪除自帶的編譯好的example1),使用靜態庫libjrtp.a連結,編譯連結語句如下(注意用g++而不是gcc編譯,因為是連結階段需要g++):
g++ -o example1 example1.cpp -I /usr/local/include/jrtplib/ -ljrtp
即生成應用程式exmaple1,注意,-I(大寫的i)引數中路徑為jrtplib標頭檔案目錄,注意:-ljrtp是小寫的“L”。根據實際情況修改。如果出現錯誤,說明動態連結庫路徑不對,有以下兩種方法可以對動態連結庫的路徑進行設定:
a、修改動態連結庫巨集LD_LIBRARY_PATH。LD_LIBRARY_PATH 這個環境變數是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設定多個搜尋目錄,這些目錄之間用冒號分隔開。export LD_LIBRARY_PATH=/usr/local/lib,然後再執行編譯,即可通過。這種方法只是暫時修改路徑,在重啟shell後會失效。
b、永久生效的方法為修改動態連結庫配置檔案/etc/ld.so.conf,或者在/etc/ld.so.conf.d裡建立一個新檔案,並把需要的目錄加到這個檔案裡。具體方法如下:
#cd /etc/ld.so.conf.d
#vim jrtplib 在編輯環境下加入/usr/local/lib,儲存退出。
#ldconfig 重新載入動態連結庫。
然後再執行編譯連結,成功生成example1檔案。
然後執行./example1。成功。
FROM:
http://hi.baidu.com/nick0411/blog/item/8ec3a7090a6a99da63d98600.html

二,arm版JRTPLIB庫的編譯
參考來源:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html
環境:arm-linux交叉編譯工具鏈4.4.3
           ubuntu 11.04
1,首先下載jrtplib-3.7.1和jthread-1.2.1
例如,我建立了/root/vedio/JRTPLib資料夾,在裡面建立
source:存放原始碼壓縮包
src-arm:arm版本編譯的原始碼
src-x86:x86版本的編譯的原始碼
target-arm:arm版本的目標資料夾(生成的檔案放在這裡)
target-x86:x86版本的目標資料夾(在這裡我直接將x86版本的預設裝載了系統目錄裡,見上以部分,這裡不贅述)
下載上述兩個檔案之後,分別將他們解壓到src-arm ,和 src-x86(上面的x86版本已經測試過了,這裡不做介紹,直接介紹交叉編譯arm版本)
2,首先編譯安裝 jthread
進入jthread-1.2.1資料夾
編譯方法:
./configure --prefix=/root/vedio/JRTPLib/target-arm --host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++
make
make  install
在編譯的時候出現了:configure: error: C compiler cannot create executables
原來是交叉編譯換將的許可權不對,重新安裝交叉編譯環境即可。
這時會看到/root/vedio/JRTPLib/target-arm多了include和lib檔案。
3,編譯安裝jrtplib
/configure --host=arm-linux CXX=arm-linux-g++ CC=arm-linux-gcc --prefix=/root/vedio/JRTPLib/target-arm
make
在編譯的時候又出現了和x86版本一樣的錯誤
rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'
rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':
rtperrors.cpp:225: error: 'snprintf' was not declared in this scope
make[1]: *** [rtperrors.lo] 錯誤 1
make[1]:正在離開目錄 `/root/vedio/JRTPLib/src-arm/jrtplib-3.7.1/src'
make: *** [all-recursive] 錯誤 1
我們按照x86的思路,解決如下
進入src修改tperrors.h
增加:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
再執行make  make install即可。
4,嘗試編譯arm版本的程式
我們將/root/vedio/JRTPLib/target-arm/include中的jthread中的標頭檔案全部拷貝到jrtplib3中,然後到src-arm目錄下看到example資料夾。裡面同樣是測試檔案,我們測試如下:
arm-linux-g++ example1.cpp -o example1  -L/root/vedio/JRTPLib/target-arm/lib  -I/root/vedio/JRTPLib/target-arm/include/jrtplib3 -ljrtp -ljthread -lpthread
結果執行生成了example1可執行檔案,使用file檢視其檔案型別發現他是arm平臺的。則我們將/root/vedio/JRTPLib/target-arm/include中的標頭檔案和/root/vedio/JRTPLib/target-arm/lib中的庫檔案拷貝到arm開發板上即可。
        由這幾次編譯庫我們可以發現,主要的步驟就是先編譯依賴庫,取得編譯依賴庫得到的標頭檔案和庫檔案,在編譯最終我們需要的庫的時候,我們需要制定依賴庫標頭檔案和依賴庫的位置,就像-L/root/vedio/JRTPLib/target-arm/lib  -I/root/vedio/JRTPLib/target-arm/include/jrtplib3這種結構,所謂的移植不過如此而已。
ps:關於使用jrtplib庫程式設計例程詳見“linux系統程式設計”部分。
感謝:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html
本文來源於特酷吧http://www.tekuba.net/, 原文地址:http://www.tekuba.net/program/178/