window 使用 vs 编译 librtmp 静态库

387 阅读2分钟

rtmpdump 介绍

RtmpDump是一个开源工具库,使用c代码编写,实现了用RTMP上传音视频流的相关功能

地址

//下载地址
git clone git://git.ffmpeg.org/rtmpdump

官网地址
https://rtmpdump.mplayerhq.hu/

下载后结构如下:

image.png

背景

在window环境下,开发rtmp的推拉流,需要使用到rtmp库。选择了rtmpdump,所以我要编译一个librtmp的.lib库给vs依赖使用。

vs版本是2022 rtmpdump版本:

image.png

编译过程

1. 创一个静态库的vs工程

image.png

image.png

下载rtmp的代码到工程目录下面 image.png

2. 添加代码

添加头文件 image.png

把rtmpdump目录的子文件夹librtmp目录下的.h 文件都添加到头文件筛选器里面

image.png

把rtmpdump目录的子文件夹librtmp目录下的.cpp 文件都添进去

image.png

3. 解决问题

直接编译会有很多报错,我们一个一个的处理

有几个预处理器定义要添加,如下

NO_CRYPTO
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS
  • _WINSOCK_DEPRECATED_NO_WARNINGS 预处理定义

image.png

添加 _WINSOCK_DEPRECATED_NO_WARNINGS 预处理器定义

image.png

  • _CRT_SECURE_NO_WARNINGS 预处理定义

image.png

  • _CRT_NONSTDC_NO_DEPRECATE 预处理定义

image.png

  • NO_CRYPTO 预处理定义

image.png

  • rtmp_sys.h 里面报错

image.png

注释下面三行

image.png

  • rtmp.c 里面添加 typedef long off_t;

image.png

解决下面错误

image.png

4. 编译库

右键工程生成成功后,会生成 StaticLib_RtmpDump.lib 静态库文件

image.png

你可以可以通过下面的地方,修改生成的库文件名称

image.png

image.png

image.png

5. 组织库和头文件为一个库文件夹

image.png

image.png

image.png

补充

在引入librmtp库的时候,又出现了两个错误

  1. 报一些符号解析不到 image.png

可以在引入头文件 #include "rtmp.h" 前面加上 #pragma comment(lib, "ws2_32.lib")

image.png

  1. 1>librtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 netstackdump 1>librtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 netstackdump_read

image.png

这是由于在librtmp的源码 rtmp.c 里面只有

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

这两个对象的前置声明,没有定义

image.png

有三种方法解决

  • 删掉这一块代码,因为他们是用来debug的
  • 编译release版本,就不会有 _DEBUG宏条件了
  • 适当位置定义 这两个变量
  • 在我这里,直接注释比较合适,

image.png

image.png

image.png

其他

代码仓库地址:

https://github.com/SnailCoderGu/vs_rtmpdump_staticlib.git