织梦CMS - 轻松建站从此开始!

罗索

windows下使用vc2008编译librtmp

落鹤生 发布于 2014-04-26 23:13 点击:次 
主要参考网站: 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-
TAG: rtmp  librtmp  

主要参考网站:

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-installerhttp://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里边,把OpenSSLZlib includelib路径都添加进去。

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

测试程序:

  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.      RTMP *rtmp;  
  9.     char uri[]="rtmp://127.0.0.1/livepkgr/livestream"
  10.     rtmp = RTMP_Alloc();  
  11.     if(rtmp == NULL) 
  12.     return 0; 
  13.     RTMPPacket rtmp_pakt; 
  14.      
  15.  
  16.  
  17.     RTMP_Init(rtmp);  
  18.     int err = RTMP_SetupURL(rtmp, (char*)uri);  
  19. if(err < 0) 
  20. return 0; 
  21.  
  22.     RTMP_EnableWrite(rtmp);  
  23.  
  24.     int a=RTMP_Connect(rtmp, NULL);  
  25. if(err < 0) 
  26. return 0; 
  27.  
  28.  
  29.     int b=RTMP_ConnectStream(rtmp,0);  
  30. if(err < 0) 
  31. return 0; 
  32.     return 0; 

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

(ripple0713)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201404/16957.html]
本文出处:CSDN博客 作者:ripple0713 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容