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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容