主要参考网站:
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
测试程序:
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