交叉編譯庫和例子
交叉編譯庫
./configure -prefix=/home/jrtp/ -host=arm-montavista-linux CC=/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc CXX=/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-g++
Make
Make install
-prefix=/home/jrtp/為編譯完成後執行make install時庫和標頭檔要安裝到的路徑的東西
安裝jthread和jrtplib的configure的方法一樣
如果是在pc機上編譯 則是直接make make install 然後將產生的lib檔案拷貝到/lib裡去
交叉編譯例子
arm_v5t_le-g++ -o example ./example2.cpp -I/home/jrtp/include/jrtplib3 -I/home/jrtp/include/jthread -L/home/jrtp/lib -ljthread -ljrtp –lpthread
問題1
後來程式固化到ARM上以後,報得不到使用者名稱的錯誤(ERROR:Can't retrieve login name),因為固化的Linux核心自動運行取消了使用者的設定,應用程式在執行的時候有一個函數是得到使用者名稱。
解決方案
板子上的檔案系統不需要使用者名稱就可以直接登入,而在JRTPLIB庫中的RTPSession中的
Create->InternalCreate->CreateCNAME中,有對使用者名稱進行一定操作,
其中的getlogin_r(),getlogin()和getenv()操作都會因為使用者名稱為空白,
而返回錯誤ERR_RTP_SESSION_CANTGETLOGINNAME。
我們可以通過修改JRTPLIB庫(我所使用的版本號碼為3.7.1)的CreateCNAME原始碼來為系統預設設定一個使用者名稱。
在RTPSession.cpp的第1400行左右,找到:
if (!gotlogin)
{
char *logname = getenv("LOGNAME");
if (logname = = 0)
return ERR_RTP_SESSION_CANTGETLOGINNAME;
strncpy((char *)buffer,logname,*bufferlength);
}
將其修改為:
if (!gotlogin)
{
char *logname = getenv( "LOGNAME" );
if( 0 = = logname )
{
printf( "Can't getenv LOGNAME, we will use /"root/" instead/n" );
strncpy( ( char * )buffer, "root", *bufferlength );
}
else
{
strncpy( ( char * )buffer, logname, *bufferlength );
}
}
問題2大小端模式使ARM給PC機發數收不到 改一下一個宏就好了.
網上的一篇文章如下
有些人會遇到arm和pc無法互相接受資料包的問題,但是pc和pc,arm和arm就可以收到。我用sniffer抓了一下包發現確實是有資料包的,所以應該不是程式的問題。這個問題上網查了一下,也沒人說的明白,只有一個高人點了一下,可能是位元組序和位域的問題。自己又研究了一下,也是一知半解。
一般x86的pc機是用小端位元組序(little endian),而嵌入式平台一般是大端位元組序(big endian),可能是由於位元組序的不同,導致了明明存在資料包,卻認不出來的問題。其實,JRTPLIB的開發人員可能已經考慮到了這個問題(真牛),在rtpstructs.h中,有這樣的代碼定義:
struct RTPHeader
{
#ifdef RTP_BIG_ENDIAN
uint8_t version:2;
uint8_t padding:1;
uint8_t extension:1;
uint8_t csrccount:4;
uint8_t marker:1;
uint8_t payloadtype:7;
#else // little endian
uint8_t csrccount:4;
uint8_t extension:1;
uint8_t padding:1;
uint8_t version:2;
uint8_t payloadtype:7;
uint8_t marker:1;
#endif // RTP_BIG_ENDIAN
uint16_t sequencenumber;
uint32_t timestamp;
uint32_t ssrc;
};
這是一個位域結構體,明眼人一下子就看出來了,jrtplib庫使用哪種位元組序完全取決於RTP_BIG_ENDIAN的定義,這樣問題就簡單化了。
我看了一下我編譯arm下jrtplib庫的rtpconfig_unix.h這個檔案,裡面果然定義了一個RTP_BIG_ENDIAN,所以要和pc採用的小端位元組序一樣,將這個定義取消掉,重新編譯庫。
最後運行exmaple1例子,pc 和arm可以互相接受資料包拉!:)這樣會引起其他什麼問題我還不知道,明天就可以動手編寫自己的程式了,呵呵