美文网首页
windows下linphone-desktop的编译

windows下linphone-desktop的编译

作者: 梦落迹南天 | 来源:发表于2018-07-23 13:37 被阅读0次

    参考资料

    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二进制文件

    image.png
    解压文件后将cmake下的bin目录添加到系统环境变量Path中,可使用cmake -version进行校验是否安装成功。

    3. 安装python2.7

    https://www.python.org/downloads/下载python2.7安装器

    image.png
    安装完毕之后,将安装目录python2.7添加到系统环境变量Path中,可使用python -v进行校验。
    为了使用pip,需要同时将python2.7\Scripts也添加到环境变量Path中。

    4. 安装doxygen

    http://www.stack.nl/~dimitri/doxygen/download.html下载

    image.png
    安装完毕后,将doxygen/bin添加到系统环境变量Path中,可使用doxygen -v进行校验

    5. 安装dot (graphviz)

    https://graphviz.gitlab.io/_pages/Download/Download_windows.html下载

    image.png
    解压后,将graphviz-2.38\release\bin添加到环境变量Path中

    6. 安装pystache

    https://pypi.org/simple/pystache/下载pystache-0.5.4.tar.gz

    image.png
    使用pip进行安装
    image.png
    或者直接使用以下指令进行安装
    pip install pystache
    

    7.安装wheel

    https://pypi.org/simple/wheel/下载 wheel-0.29.tar.gz

    image.png
    使用pip进行安装
    image.png
    或者直接使用如下指令进行安装
    pip intall wheel
    

    8. 安装MinGW

    https://sourceforge.net/projects/mingw/?source=typ_redirect下载后安装(注意安装的时候一定要使用安装器推荐的默认安装C盘,因为linphone的make文件中写死了),将其bin目录添加到系统环境变量Path中。
    要安装基本的g++编译器和一些基础的库

    image.png

    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++相应库的时候,又使用这个不完整的包进行安装导致的。

    image.png

    然后还遇到了一个这样的问题,这里说的是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.logXXXXXX是发生错误的项目的名字,在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

    相关文章

      网友评论

          本文标题:windows下linphone-desktop的编译

          本文链接:https://www.haomeiwen.com/subject/rwhqpftx.html