天天看點

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/

繼續閱讀