windows10系统VS2017编译live555

需要编译live555的源码,win10系统,使用VS2017

1. 下载源码

下载地址: http://www.live555.com/liveMedia/public/

下载内容: live555-latest.tar.gz

2. 编译步骤

  1. 将下载的文件,解压在 D:\live555\live 路径下. 只需要上面的几个文件夹,下面的内容用不到。
  2. 打开vs2017,新建一个项目,Visual C++,  选择空项目 (因为vs2017升级版本后,没有了win32控制台应用程序的 选择空项目的那个设置页。)
  3. 输入名称:UsageEnvironment。如下图:

 5. 继续添加其他项目,groupsock

6. 添加 liveMedia 项目

 7. 添加 mediaServer 项目

8. 继续添加UsageEnvironment. 同上面的步骤。

9. 添加完5个项目之后,如下图所示。项目名称与文件名一一对应。

        

10. 将解压好的文件,对应的文件夹的内容,分别移动到项目的对应的文件夹下面,如下面两幅图所示,移动BasicUsageEnvironment的所有文件到项目中。 只需要移动 .cpp  .c  .hh  .h(头文件在include的直接移动include文件夹)文件。

11. 将解压的文件中(上面右图)的include文件,即 .hh 和 .h 文件,添加到对应项目头文件中, 将文件中的 .cpp .c 文件,添加到对应项目的源文件中。 需要注意的一点是,解压的文件中include文件之外也存在 .hh .h 文件,也需要把这些文件移动到include中,然后添加到对应的项目的头文件中。右键-》添加-》现有项。

12. 如下图所示,就把所有的 .hh   .h  .cpp  .c 等文件都添加好了,需要注意一下, liveMedia的头文件和源文件比较多,且有些头文件散落 .cpp .c 文件里面,需要移动到include中。

13. 对BasicUsageEnvironment   groupsock   liveMedia   UsageEnvironment mediaServer 五个项目,都需要做如下操作:

右键项目名称 --》属性--》 C/C++  --》 常规 --》附加包含目录--》 为每一个项目都添加这四个项目的include路径,liveMedia没有include,就直接到 liveMedai这一条即可。

14.  由于vs2017升级之后,没办法在一开始创建空项目的时候指定是编译静态库还是可执行文件,所以需要再此处进行设置。很重要。

对BasicUsageEnvironment   groupsock   liveMedia   UsageEnvironment 四个项目,都进行如下操作:

右键项目名称 --》  配置属性 --》 常规 --》  项目默认值 -- 》  配置类型 --》  改为:静态库。  切记,没有mediaServer项目,因为这个一开始就是 .exe项目。

15. 如果不进行14步骤的设置,对文件编译,会出现如下错误。 因为没有main函数,找不到执行入口。

具体原因,参考:https://blog.csdn.net/wushao126/article/details/51785505

1>------ 已启动生成: 项目: UsageEnvironment, 配置: Debug Win32 ------
1>HashTable.cpp
1>strDup.cpp
1>UsageEnvironment.cpp
1>正在生成代码...
1>LINK : fatal error LNK1561: 必须定义入口点
1>已完成生成项目“UsageEnvironment.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

16. 对BasicUsageEnvironment   groupsock   liveMedia   UsageEnvironment 四个项目,进行如下操作:选中项目名称,右键,生成,等待即可。(先别急着操作,后面出现了一点小插曲,看完再操作)。切记,没有mediaServer项目。

3. 出现的问题

1. 编译BasicUsageEnvironment 出现如下问题:

1>d:\project3\live555\basicusageenvironment\basicusageenvironment0.cpp(79): 
error C4996: '_snprintf': This function or variable may be unsafe. Consider using 
_snprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 
See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\stdio.h(1961):
 note: 参见“_snprintf”的声明
1>DelayQueue.cpp
1>正在生成代码...
1>已完成生成项目“BasicUsageEnvironment.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

2. 解决方案:在预处理器定义中,添加: _CRT_SECURE_NO_WARNINGS      对BasicUsageEnvironment   groupsock   liveMedia   UsageEnvironment  四个项目都进行如下操作, mediaServer项目也需要这样添加。

解决方案参考:https://www.cnblogs.com/wanghui1234/archive/2018/06/09/9158853.html

4. 编译结果:

BasicUsageEnvironment 成功!!!

1>------ 已启动生成: 项目: BasicUsageEnvironment, 配置: Debug Win32 ------
1>BasicHashTable.cpp
1>BasicTaskScheduler.cpp
1>BasicTaskScheduler0.cpp
1>BasicUsageEnvironment.cpp
1>BasicUsageEnvironment0.cpp
1>DelayQueue.cpp
1>正在生成代码...
1>BasicUsageEnvironment.vcxproj -> D:\project3\live555\Debug\BasicUsageEnvironment.lib
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

 UsageEnvironment 成功!!!

1>------ 已启动全部重新生成: 项目: UsageEnvironment, 配置: Debug Win32 ------
1>HashTable.cpp
1>strDup.cpp
1>UsageEnvironment.cpp
1>正在生成代码...
1>UsageEnvironment.vcxproj -> D:\project3\live555\Debug\UsageEnvironment.lib
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

groupsock 失败了!!!查看原因,是这样的:

1>d:\project3\live555\groupsock\netaddress.cpp(108): error C4996: 'gethostbyname': 
Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS
 to disable deprecated API warnings
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\winsock2.h(2219): 
note: 参见“gethostbyname”的声明
1>NetInterface.cpp
1>正在生成代码...
1>已完成生成项目“groupsock.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

 5. 解决方案: 为groupsock 项目添加: _WINSOCK_DEPRECATED_NO_WARNINGS     修改如下,再编译,groupsock就通过了。

 groupsock 成功!!!

1>------ 已启动全部重新生成: 项目: groupsock, 配置: Debug Win32 ------
1>GroupEId.cpp
1>Groupsock.cpp
1>GroupsockHelper.cpp
1>d:\project3\live555\groupsock\groupsockhelper.cpp(844): warning C4244: “=”: 
从“time_t”转换到“long”,可能丢失数据
1>IOHandlers.cpp
1>NetAddress.cpp
1>NetInterface.cpp
1>正在生成代码...
1>inet.c
1>groupsock.vcxproj -> D:\project3\live555\Debug\groupsock.lib
1>已完成生成项目“groupsock.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

6. 遇到一个大麻烦:openssl/ssl.h 找不到。因为Windows上没有这个库,所以还得需要额外下载这个库,安装编译。

1>d:\project3\live555\livemedia\include\tlsstate.hh(31): fatal error C1083: 
无法打开包括文件: “openssl/ssl.h”: No such file or directory
1>uLawAudioFilter.cpp
1>VideoRTPSink.cpp
1>VorbisAudioRTPSink.cpp
1>VorbisAudioRTPSource.cpp
1>VP8VideoRTPSink.cpp
1>VP8VideoRTPSource.cpp
1>VP9VideoRTPSink.cpp
1>VP9VideoRTPSource.cpp
1>WAVAudioFileServerMediaSubsession.cpp
1>WAVAudioFileSource.cpp
1>正在生成代码...
1>已完成生成项目“liveMedia.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

===================================隔断========================

因为缺少openssl文件,所以需要下载OpenSSL库文件,然后又从activePerl中下载编译器,对OpenSSL进行编译。在编译过程中,又出现一个乌龙,activePerl编译器缺少东西,又得下载并完善activePerl编译器。

上述是逆序过程,正确的顺序是:

下载并安装activePerl,下载OpenSSL,用activePerl编译OpenSSL,备用。然后把编译好的OpenSSL加入到live555中,再编译live555. 。。。

上述过程,参考链接:https://blog.csdn.net/qq_34732729/article/details/104188331

==================================隔断==========================

4. 编译好的库

1. 其他四个项目都编译好了,在live555项目的debug下,有四个 .lib 文件。

2. 在mediaServer项目文件中,新建一个 lib 文件夹,将上面的四个 .lib文件添加到这个文件夹里面。里面的txt文件时我添加的,为了后面赋值lib 的时候,更方便。

3. 右键mediaServer属性,选择连接器,附加库目录

4. 右键mediaServer属性,连接器,输入,就是刚才在 txt 文件里面存的几个lib 文件名称,如下:

BasicUsageEnvironment.lib;groupsock.lib;liveMedia.lib;UsageEnvironment.lib;Ws2_32.lib

 5. 重新编译mediaServer 项目,出现如下问题,是因为我没有添加链接文件。

1>------ 已启动全部重新生成: 项目: mediaServer, 配置: Debug Win32 ------
1>DynamicRTSPServer.cpp
1>d:\project3\live555\mediaserver\dynamicrtspserver.hh(25): fatal error C1083: 
无法打开包括文件: “RTSPServerSupportingHTTPStreaming.hh”: No such file or directory
1>live555MediaServer.cpp
1>d:\project3\live555\mediaserver\live555mediaserver.cpp(20): fatal error C1083: 
无法打开包括文件: “BasicUsageEnvironment.hh”: No such file or directory
1>正在生成代码...
1>已完成生成项目“mediaServer.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

 6. 5的解决方案如下:

清理,再次编译,出现如下错误:是因为OpenSSL的库不合理。

1>------ 已启动全部重新生成: 项目: mediaServer, 配置: Debug Win32 ------
1>DynamicRTSPServer.cpp
1>live555MediaServer.cpp
1>正在生成代码...
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _BIO_new_socket,该符号在
函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_CTX_new,该符号在函
数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_CTX_free,该符号在函
数 "private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_set_bio,该符号在函
数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_new,该符号在函数 
"private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_free,该符号在函数 
"private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_connect,该符号在函
数 "public: int __thiscall TLSState::connect(int)" (?connect@TLSState@@QAEHH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_read,该符号在函数 
"public: int __thiscall TLSState::read(unsigned char *,unsigned int)" (?read@TLSState@@QAEHPAEI@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_write,该符号在函数 
"public: int __thiscall TLSState::write(char const *,unsigned int)" (?write@TLSState@@QAEHPBDI@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_get_error,该符号在
函数 "public: int __thiscall TLSState::connect(int)" (?connect@TLSState@@QAEHH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _TLS_client_method,该符
号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_shutdown,该符号在函
数 "private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_set_connect_state,
该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _OPENSSL_init_ssl,该符
号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>D:\project3\live555-2\Debug\mediaServer.exe : fatal error LNK1120: 14 个无法解析的外部命令
1>已完成生成项目“mediaServer.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

7. 将编译正确的OpenSSL库,拿过来,放在文件中,如图:

8. 直接编译的话,会出现下面的问题。建议先看下面的解决方案。

1>------ 已启动全部重新生成: 项目: mediaServer, 配置: Debug Win32 ------
1>DynamicRTSPServer.cpp
1>live555MediaServer.cpp
1>正在生成代码...
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _BIO_new_socket,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_CTX_new,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_CTX_free,该符号在函数 "private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_set_bio,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_new,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_free,该符号在函数 "private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_connect,该符号在函数 "public: int __thiscall TLSState::connect(int)" (?connect@TLSState@@QAEHH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_read,该符号在函数 "public: int __thiscall TLSState::read(unsigned char *,unsigned int)" (?read@TLSState@@QAEHPAEI@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_write,该符号在函数 "public: int __thiscall TLSState::write(char const *,unsigned int)" (?write@TLSState@@QAEHPBDI@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_get_error,该符号在函数 "public: int __thiscall TLSState::connect(int)" (?connect@TLSState@@QAEHH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _TLS_client_method,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_shutdown,该符号在函数 "private: void __thiscall TLSState::reset(void)" (?reset@TLSState@@AAEXXZ) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _SSL_set_connect_state,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>liveMedia.lib(TLSState.obj) : error LNK2019: 无法解析的外部符号 _OPENSSL_init_ssl,该符号在函数 "private: bool __thiscall TLSState::setup(int)" (?setup@TLSState@@AAE_NH@Z) 中被引用
1>D:\project3\live555-2\Debug\mediaServer.exe : fatal error LNK1120: 14 个无法解析的外部命令
1>已完成生成项目“mediaServer.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

 修改mediaServer的属性。解决方案如下:将编译好的OpenSSL的库include包含进来。

添加附加依赖项的 lib库。

添加之后,如果直接编译,会出现下面的缺少dll 提示。莫慌。

  

把缺少的dll ,从编译好的文件中,移动到 可执行文件的debug目录下面,即可。

先清理,再编译,成功。

控制台中打印出客户端访问时使用的URL地址格式和live555支持的文件类型。

长舒一口气!!!舒服。

5. 下载VLC,作为客户端,调试

上图中,第4行,是URL地址格式。

打开VLC,选择媒体,打开网络串流,输入上图中第四行的地址,文件名称改一下,视频文件放在mediaServer.exe的目录中,点击播放,即可。

可能会出现错误:如下:是因为url写错了,或者是视频文件没有放对地方。

路漫漫其修远兮,吾将上下而求索。

发布了384 篇原创文章 · 获赞 110 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_34732729/article/details/104185103