最近在学习RTP协议,所以我将对JRTPLib的学习过程从配置到使用一一列举如下,供大家参考,希望对大家有所帮助!
以下为网上流行的编译JRTPLib.lib + JThread.lib的方法:
1、源程序下载
版本:JRTPLib.lib_3.7.1 + JThread_1.2.1
地址:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib.html
2、编译源程序
注意:每一个源程序在编译前必须要将运行时库改为“多线程DLL(/MD)”。否则会出现error Link 2005.
在VC++ 2008中,具体过程为:项目 -> 属性 -> C/C++代码生成 -> 运行时库,如下图所示:
在VC++ 6.0中,也要同样设置:工程 -> 设置 ,要将所有的source files中的文件的C/C++选项卡中的“分类:Code Generation”设置“Use run-time Library”为"Debug Multithreaded DLL"。如下图所示:
(1)编译JThread:打开JThread.dsw工程文件(版本转换),直接Release编译即可通过,在Release文件夹下生成JThread.lib库文件;
(2)编译JRTPLib:将刚生成的JThread.lib拷贝到JRTPlib的工程目录下;将JThread/src中的JMutex.h和JThread.h两个文件拷贝到JRTPlib的src目录中;打开JRTPlib.dsw(版本转换),将JRTPLib项目的所有文件中的 #include <jmutex.h> 和 #include <jthread.h>改为 #include "jmutex.h" 和 #include "jthread.h"。选择Release编译,即可生成JRTPlib.lib文件。
3、例子测试(以Example1为例) 新建一个空的win32 控制台程序,在解决方案的源文件中新建一个cpp文件,内容拷贝example1(这个在JRTPLib文件夹下的Example目录中)即可,在当前项目程序目录下新建一个文件夹称为JRTPLIB_H,将JRTPLIB源程序中src目录下的所有头文件拷贝过来,在项目解决方案的头文件中添加JRTPLIB_H目录下的所有头文件。最后,将JThread.lib以及JRTPLib.lib两个库文件拷贝过来放在和例子程序相同的目录下。 将例子程序中前面几行改为: #include "JRTPLIB_H/rtpsession.h"
#include "JRTPLIB_H/rtppacket.h"
#include "JRTPLIB_H/rtpudpv4transmitter.h"
#include "JRTPLIB_H/rtpipv4address.h"
#include "JRTPLIB_H/rtpsessionparams.h"
#include "JRTPLIB_H/rtperrors.h" 再添加:
#pragma comment(lib,"jrtplib.lib")
#pragma comment(lib,"jthread.lib")
#pragma comment(lib,"ws2_32.lib")
编译程序即可运行!
在编译jrtplib.lib和jthread.lib的时候,在project——settings——C/C++——Code generation:use run-time library中,对于debug,选择:Debug Multithreaded DLL,对于release,则选择:Multithreaded DLL。
编译的时候,同样选择编译选项:Debug Multithreaded DLL(对于debug);Multithreaded DLL(对于release)。编译,通过。注意编译库和编译控制台程序时使用的编译选项应该一致。可以进行单步调试,但是要先设一个断点。
The End ~~
问题:我们在进行调试JRTPLib.lib_3.7.1中的example的时候会遇到如下的问题:
“1.exe 中的 0x0042e7ee 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 ”
并且在代码中会停在如下的语句上
status = sess.Create(sessparams,&transparams);(其中RTPSession sess;)
经过我两天的整理,我发现原来我的JRTPLib.lib + JThread.lib是在Release版本的,而我在调试example的时候是Debug版本的。版本不同,所以会出错!至于为什么,我个人认为似乎是JRTPLib.lib + JThread.lib的两个版本不同!
兄弟们注意了,在编译那几个例子时你的运行可能都能通过编译,运行,但是一旦你使用VC++或者vs下的MFC框架写程序时,一定要注意的是你的程序中一定不能加载带有AFXWinSocks库模块,或者加载后再删除在StdAfx.h文件中的 #include <afxsock.h>以及APP文件中如下代码
BOOL CBackStageSystemApp::InitInstance(){// if (!AfxSocketInit())// {// AfxMessageBox(IDP_SOCKETS_INIT_FAILED);// return FALSE;/// }
然后运行ok,不然你会看到一大堆的重复定义的错误,而且这些错误是在afxsock.h文件中。
这个错误找了很久很久,也想了很久很久,从错误的类型看本人估计就是在向导中添加了winSocks模块,把 #include <afxsock.h>删掉后一切正常,很气愤,郁闷了很久