windows下linphone-desktop的编译
参考资料
https://blog.csdn.net/zzygchsh/article/details/58601648
https://blog.csdn.net/ddddffffggggg/article/details/79637480
https://blog.csdn.net/liccon/article/details/54755005
https://blog.csdn.net/sunxianliang1/article/details/52945104
系统环境
win10 x64
安装过程
1.获取linphone源码
使用如下语句获取linphone源码,其中-b后的4.1.0是版本号,可以在github对应https://github.com/BelledonneCommunications/linphone-desktop的changelog看到最新版本号
git clone git://git.linphone.org/linphone-desktop.git -b 4.1.0 --recursive
下载过程比较漫长,整个4.1.0下载完毕之后大小约为1.44GB
2. 安装cmake
到https://cmake.org/download/ 下载cmake二进制文件
解压文件后将cmake下的bin目录添加到系统环境变量Path中,可使用cmake -version进行校验是否安装成功。
3. 安装python2.7
从https://www.python.org/downloads/下载python2.7安装器
安装完毕之后,将安装目录python2.7添加到系统环境变量Path中,可使用python -v进行校验。
为了使用pip,需要同时将
python2.7\Scripts
也添加到环境变量Path中。
4. 安装doxygen
从http://www.stack.nl/~dimitri/doxygen/download.html下载
安装完毕后,将
doxygen/bin
添加到系统环境变量Path中,可使用doxygen -v
进行校验
5. 安装dot (graphviz)
从https://graphviz.gitlab.io/_pages/Download/Download_windows.html下载
解压后,将
graphviz-2.38\release\bin
添加到环境变量Path中
6. 安装pystache
从https://pypi.org/simple/pystache/下载pystache-0.5.4.tar.gz
使用pip进行安装
image.png
或者直接使用以下指令进行安装
pip install pystache
7.安装wheel
在https://pypi.org/simple/wheel/下载 wheel-0.29.tar.gz
使用pip进行安装
image.png
或者直接使用如下指令进行安装
pip intall wheel
8. 安装MinGW
从https://sourceforge.net/projects/mingw/?source=typ_redirect下载后安装(注意安装的时候一定要使用安装器推荐的默认安装C盘,因为linphone的make文件中写死了),将其bin目录添加到系统环境变量Path中。
要安装基本的g++编译器和一些基础的库
9. 安装GetGnuWin32
从https://sourceforge.net/projects/getgnuwin32/files/latest/download下载安装,将其bin目录添加到系统环境变量中
10. 安装javajdk
11. 安装qt
去https://www.qt.io/download下载免费的opensource即可,版本要大于等于5.9
下载安装完毕之后,在安装qt的时候要注意勾选 msvc 2015,最后,配置好如下环境
Qt5_DIR="C:\Qt\5.9\msvc2015\lib\cmake"
PATH="C:\Qt\5.9\msvc2015\bin;%PATH%"
12 安装vs
vs安装2015版本(https://pan.baidu.com/s/1WOC4VDYo5XWZjiRHNISoYg),readme中提到2013版本也可以,但github上的issue上有提到会导致某个问题。
编译过程
使用vs提供的命令行工具"Visual Studio Command Prompt "(中文名为vs_2017的x64_x86交叉工具命令提示符)进入到linphone-desktop目录下,使用如下指令生成linphone的解决方案
python prepare.py
我曾经遇到了如下的错误:Error copying file "GCC_LIBRARY-NOTFOUND" to "D:/software/linphone-desktop/linphone-desktop/OUTPUT/desktop/lib/gcc.lib"。意思是想要拷贝库到linphone文件下,但是没有找到这个库
image.png
经过文件的定位之后找到了,文件的运行顺序为 :
prepare.py
linphone-desktop\submodules\cmake-builder\CMakeLists.txt
linphone-desktop\submodules\cmake-builder\cmake\CMakeLists.txt
linphone-desktop\submodules\cmake-builder\configs\config-desktop.cmake
linphone-desktop\submodules\cmake-builder\configs\config-desktop-common.cmake
linphone-desktop\submodules\cmake-builder\builders\CMakeLists.txt
linphone-desktop\submodules\cmake-builder\cmake\CheckBuildTools.cmake
....
错误的发生点为linphone-desktop\submodules\cmake-builder\cmake\CheckBuildTools.cmake下的45~55行,到mingw下确实没有找到libgcc.a这个文件,倒腾了一天发现应该是网络问题导致MinGW没有完全安装好,就算使用安装器重新安装c++编译器也无济于事,重装Mingw后解决了这个问题,估计是MinGW自带的Package安装器将没有完整的下载某个包,而重新安装c++相应库的时候,又使用这个不完整的包进行安装导致的。
然后还遇到了一个这样的问题,这里说的是file rename failed,参考网上的log4j也有类似的函数语义,实际上是拷贝文件失败的意思,于是乎手动将这些文件拷贝过去。
image.png
然后还遇见了一个问题,幸亏有前人踏过这个坑,https://download.csdn.net/download/acliyu/10122299?web=web ,不妨打开这个脚本看看,发现里面少了对vs17的选项,只支持到vs15
file not found
WORK/desktop/cmake/windowsenv_libpath.txt
WORK/desktop/cmake/windowsenv_lib.txt
WORK/desktop/cmake/windowsenv_include.txt
WORK/desktop/cmake/windowsenv_path.txt
到了这里,回想起readme文档提到的visual studio,我将vs从2017换到了2015,使用visual studio 打开生成的linphone-desktop/project.sln
编译结果
第一次编译失败了14个项目
image.png
一共遇到了如下的问题:
1 error LNK2019: 无法解析的外部符号 _mbedtls_snprintf
这个问题很幸运的在github的issue上找到了解决方法https://github.com/BelledonneCommunications/linphone-desktop/issues/24,大概意思就是拷贝origin/linphone创建一个新的名字为linphone 的分支,回滚到该分支的93f8cbe7bf25d50cea737194a19d0efaf9ff7081
cd submodules/externals/mbedtls/
git fetch
git checkout -b linphone origin/linphone
git reset --hard 93f8cbe7bf25d50cea737194a19d0efaf9ff7081
2 UINT32_MAX”: 未声明的标识符 [D:\software\linphone\linphone-desktop\WORK\desktop\Build\bellesip\src\bellesip.vcxproj] EP_bellesip D:\software\linphone\linphone-desktop\submodules\belle-sip\src\belle_sip_resolver.c 172
不清楚这个为什么会没声明,直接打开了源码belle_sip_resolver.c在其上面添加了
#ifndef UINT32_MAX
#define UINT32_MAX 0xffffffff
#endif
3 错误 C2220 警告被视为错误 - 没有生成“object”文件
产生的这种问题绝对不能忽视,因为vs的严格控制直接导致了没有obj文件生成,会导致依赖它的项目缺少一些库或者别的东西,不能当作warnings给忽视了,见后面有说坚决方式。
4 error MSB6006: “cmd.exe”已退出,代码为 1
上github上的issue搜到这个的时候,说reamed中写过支持vs为2015,我以为是17版本的vs导致了这个问题,所以换了个15的版本。后来才发现问题并不是一个单一的问题,各种问题都存在,需要看/linphone-desktop/WORK/desktop/Build/xxxxxx/CMakeFiles/CMakeOutput.log以及 /linphone-desktop/WORK/desktop/Build/xxxxxxx/CMakeFiles/CMakeError.log,XXXXXX是发生错误的项目的名字,在CmakeError.log中发现缺少了很多库,比如pthread.h、alloca.h、sys/shm.h,然后从MinGW的安装器中将所有能装的库都装上
5 By not providing "FindLinphone.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Linphone"
这个问题卡了很久,主要是说没有找到FindLinphone.camke这个文件,当我去全局搜这个文件的时候确实是没有的,只找到一个叫做"FindLinphone.camke.in"的文件,但是这个文件是用来生成"FindLinphone.cmake"的,所以发生了什么导致了它生成失败了。我遇到的最主要的是因为我一直忽视了前面的一些warning导致的报错,vs编译器中把一些warning(比如不能使用sprintf等)严格化后当成了error导致obj文件没有生成,就导致缺少了一些lib,到了最后构建cmake的时候,由于没有找到这些lib导致生成失败,所以没法生成make文件,要解决这个,必须按照输出的错误信息,从上往下一个一个解决,去linephone-desktop/work/desktop/build/下找到生成失败的工程,打开其文件下的.sln进行单独编译(会引入依赖)。
其中单独编译失败的工程的时候遇到的比较难处理的是:
6 \Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xkeycheck.h(203): warning C4005: “inline”: 宏重定义
这种自定义inline导致和系统文件发生冲突的情况,只需要找到了然后将它删掉就好,但是在全局文件搜索后找到的有关#define inline进行处理后还是不好使,于是乎在报错的文件下(\linphone-desktop\submodules\mediastreamer2\src\videofilters\msdscap.cc)加入了如下的预定义
#ifndef _XKEYCHECK_H
#define _XKEYCHECK_H
#endif
然后对于问题连接器工具错误 LNK2026 XXX模块对于SAFESEH 映像是不安全的,右键->属性->链接器->命令行->输入/SAFESEH:NO
最后,单独编译的项目的一些配置和设置无法在编译整个project.sln设置,可以参考以下文章,对vs进行全局项目的设定https://blog.csdn.net/sunxiaoju/article/details/50936634
最终可以在linphone-desktop/output下找到编译好exe等文件。
end
最后总结一下,linphone-desktop编译会遇到的情况,在生成解决方案之前,基本上都是软件或者库没有安装好导致的环境问题,以及上面提到过的那个failed to rename拷贝文件的问题。而在VS编译中遇到的问题,可能是vs版本过高,或者vs为了安全将warnings控制成了error,一定要按照顺序,从头开始单独的去解决。遇到问题,多看看readme文档提到的环境要求,尽量去google以及github上的issue搜看有没有相同的,没有的话,可能是操作比较反常(比如像我一开始是从最后一个报错开始处理,结果后来发现错误点是在前面)。
最后附上编译的源码文件: https://pan.baidu.com/s/1XwbZTo0s154uHYm3kWR3Vw