windows下使用vc2008编译librtmp

来源:互联网 发布:随机出题软件破解 编辑:程序博客网 时间:2024/05/21 19:48

主要参考网站:

http://blog.csdn.net/senophen/article/details/7349045

http://zhaostudy2.blog.163.com/blog/static/1353502052011182538414/

http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html

 

一、软件/源代码下载地址:

rtmpdump-2.3+ openssl-1.0.0

rtmpdump:http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz

openssl:http://www.openssl.org/source/openssl-1.0.0.tar.gz

ActivePerl-5.12.2.1202-MSWin32-x86-293621:http://downloads.activestate.com/ActivePerl/releases/5.12.2.1202/ActivePerl-5.12.2.1202-MSWin32-x86-293621.msi

zlib-1.2.5: http://cdnetworks-kr-1.dl.sourceforge.net/project/libpng/zlib/1.2.5/zlib-1.2.5.tar.gz

nasm-2.10.01-installer:http://www.nasm.us/pub/nasm/releasebuilds/2.10.01/win32/nasm-2.10.01-installer.exe

 

 

二、

1. 编译openssl1.0.0

a) 下载并安装ActivePerl

b)下载并安装nasm

p.s.要将安装后的nasm加入环境变量path :C:\Users\L\AppData\Local\nasm;或者将C:\Users\L\AppData\Local\nasm目录下nasm.exe改名为nasmw.exe然后复制到openssl源代码目录下。

否则会出现错误:’nasmw’ 不适nebulizer或外部命令,也不是可运行的程序 NMAKE:fatal errorU1077:’nasmw’:return code ‘0x1’

出现错误后,若使用改变环境变量的方法,需要关掉命令窗口重新执行命令。

c) 解压openssl压缩包

d) 运行Visual Studio Command Prompt(2010),切到openssl目录,分别执行以下命令。

>perl Configure VC-WIN32 --prefix=c:\some\dir
>ms\do_nasm

>nmake -f ms\nt.mak
>nmake -f ms\nt.mak install

nmake -f ms\nt.mak成功的话应提示生成了openssl.exe并返回1。

(执行nmake -f ms\ntdll.mak一般都不会产生什么错误,但是编译出来的是动态库,不是想要的静态库)


执行nmake -f ms\nt.mak可能出现如下错误:


解决方法:运行cl.exe,以及C:\ProgramFiles\Microsoft Visual Studio 9.0\VC 目录下的vcvarsall.bat,之后可能需要关闭命令行窗口再执行一遍命令。

又出现link.EXE:return code ‘0x460’:(将源代码重新解压一遍,再编译就成功了==。。)


2. 编译zlib

  a) 解压zlib压缩包

  b) 运行VisualStudio Command Prompt(2008),切到zlib-2.1.5目录,分别执行以下命令

>cd contrib\masmx86
>bld_ml32.bat

  c) 回到zlib目录,进入contrib\vstudio\vc9目录,打开vs2008解决方案文件,

   在zlibstat工程属性中,去掉预编译宏ZLIB_WINAPI

d) 选择debug或release编译即可

TIP 1、执行c步骤时,打开的工程里,要把debug/Release栏旁边的Itanium改选成win32,否则在选择工程属性时会出来对话框提示,Theoperation could not be completed! 

TIP2、预编译宏位于,工程属性面板,ConfigurationPropertiesà c/c++àPreprocessoràPreprocessorDefinition

3. 编译librtmp

a) 首先打开visualstudio 2010,新建一个win32 console工程librtmp,指定为静态链接库,取消precompiled header


b) 将librtmp的代码导入工程,把openssl、zlib的头文件和librtmp放在一起,把编译好的openssl和zlib的静态库放在工程下的文件夹中。

lib文件夹


E:\rtmpdump-2.3\librtmp目录中所有的.h和.c文件。复制到librtmp工程下。并添加到HeaderFiles和SourceFiles

c) 在工程设置中,添加之前编译好的openssl和zlib的依赖库,编译即可。libeay32.lib ssleay32.lib zlibstat.lib


d)在vs2008 toolsà optionà projects and solutionsàvc++ directories里边,把OpenSSL和Zlib的 include和lib路径都添加进去。

Include files添加路径  C:\openssl\include 和 D:\Projects\librtmp\librtmp

Include Libraries : C:\openssl和D:\Projects\librtmp\librtmp\lib

e)

首先编译文件hashswf.c,您一定会得到错误找不到 stdint.h头文件这个文件网上有搜索自己下载stdint.h添加到工程中

D:\Projects\test\librtmp\Release中的librtmp.lib就是所要的库文件。

g)测试库是否可正常使用

新建win32工程,选择静态库,取消预编译头,添加librtmp.lib的外部依赖项。

之后在头文件中加上

#pragma comment(lib,"WS2_32.lib")///////////add

(因为出现1>librtmp.lib(rtmp.obj): error LNK2001: unresolved external symbol __imp__send@16等一系列错误

#pragma comment(lib,"winmm.lib")///////////add

(因为出现1>librtmp.lib(rtmp.obj): error LNK2001: unresolved external symbol __imp__timeGetTime@0等错误

#pragma comment(lib"zlib.lib")///////////add

(因为出现1>librtmp.lib(hashswf.obj): error LNK2001: unresolved external symbol _inflateInit_等错误

但是还会出现错误:

librtmp.lib(rtmp.obj): error LNK2001: unresolved external symbol _snprintf,etc

测试程序:

[cpp] view plaincopy
  1. #include "stdafx.h"  
  2. #include "librtmp/rtmp_sys.h"    
  3. #include "librtmp/log.h"    
  4. #include "librtmp/amf.h"    
  5.   
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.      RTMP *rtmp;   
  10.     char uri[]="rtmp://127.0.0.1/livepkgr/livestream";  
  11.     rtmp = RTMP_Alloc();   
  12.     if(rtmp == NULL)  
  13.     return 0;  
  14.     RTMPPacket rtmp_pakt;  
  15.       
  16.   
  17.   
  18.     RTMP_Init(rtmp);   
  19.     int err = RTMP_SetupURL(rtmp, (char*)uri);   
  20. if(err < 0)  
  21. return 0;  
  22.   
  23.     RTMP_EnableWrite(rtmp);   
  24.   
  25.     int a=RTMP_Connect(rtmp, NULL);   
  26. if(err < 0)  
  27. return 0;  
  28.   
  29.   
  30.     int b=RTMP_ConnectStream(rtmp,0);   
  31. if(err < 0)  
  32. return 0;  
  33.     return 0;  
  34. }  

f)需要按照http://zhaostudy2.blog.163.com/blog/static/1353502052011182538414/修改源代码,再重新编译。

但是,这样编译出来的librtmp.lib

在使用的时候会出现很多个外部符号未定义的错误。如下图所示:


这是librtmp的条件编译导致的问题,解决方法是:在rtmp_sys.h中把代码:

#ifdef _XBOX
#include <xtl.h>
#include <winsockx.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf

#else /* !_XBOX */
#include <winsock2.h>
#include <ws2tcpip.h>
#endif

改为

#include <winsock2.h>
#include <ws2tcpip.h>

#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf

然后,删除rtmp.c中的如下代码:

#ifdef _DEBUG
fwrite(buf, 1, len, netstackdump);
#endif

#ifdef _DEBUG
extern FILE *netstackdump;
extern FILE *netstackdump_read;
#endif

#ifdef _DEBUG
fwrite(ptr, 1, nBytes, netstackdump_read);
#endif

8)编译rtmp.c即可得到librtmp.lib