在Win10中编译 Linphone SDK 的x64版本

官网提供了Win32的编译结果,可以直接下载到,但是链接的时候会出现如下错误:

Severity	Code	Description	Project	File	Line	Suppression State
Error	LNK2019	unresolved external symbol __imp_linphone_auth_info_new referenced in function "xxxxxxxxx

可以确认的是sdk的lib文件已经正确配置且可以加载,用dependency walker查看dll,也能看到linphone_auth_info_new()函数,但是以某种变态方式打开lib文件,发现此函数导出格式为:

__imp__linphone_auth_info_new

而不是想象中的

__imp_linphone_auth_info_new

根据以上错误,链接器的确是找’__imp_linphone_auth_info_new’而不是’__imp__linphone_auth_info_new’。 不确定为什么会出现这样的错误,但是官网给的文件名是带Win32的,不确定是win32 x86的,还是win32 x64的,无论如何,值得在本机编译一个x64的版本测试此链接问题。

在Windows下编译Linphone SDK 的确是一大考验,中间会碰到各种问题

git clone 源代码

官网git克隆源代码一定要带上’–recursive’参数,否则很多模块默认不下载:

git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git --recursive

同样,更新源代码也得带上此参数:

git submodule update --init --recursive

python安装

linphone sdk是用cmake管理工程的,所以上来就先执行一下cmake指令:

cmake -H. -Bbuild -G"Visual Studio 16 2019" -Ax64

发现提示说python缺少pystache模块,打开命令模式,直接执行

pip install pystache

此模块安装比较顺利,再次执行,提示已经发现pystache模块,但是提示缺少six模块,继续执行:

pip install six

这次就没这么幸运了,提示连接错误,无法安装six模块,尝试很多方法无效,最终用某墙软件在app级别X墙,成功下载并安装上了six模块。其实解决这个问题还有个办法,就是到six官网下载six包,直接本地安装,但本人没尝试过。

MinGW安装

linphone sdk 还用到了 pkg-config,但是这是类Unix系统下的东西,在windows下可以用MinGW来做到。 inGW有两个版本,一个是MinGW,一个是Mingw-w64,注意,一定要安装MinGW版本,而且路径一定是C盘的C:\MinGW目录,因为linphone cmake脚本把这个路径写死了,直接用了C:\MinGW\bin目录。

yasm安装

刚开始完全不理解yasm是个什么东西,也不知道用来干什么,就按照说明做就是了,从官网下载一份放到C:\vsyasm-1.3.0-win64目录下,在系统环境变量的Path下加入此路径。 注意,这里可能要确保其有写权限,所以最好放到user目录下。注意一定要把原exe程序名改为yasm.exe,否则还会报找不到yasm.exe的错误。

pkg-config下载及安装

cmake会调用下载指令动态下载pgk-config程序,并将其放到MinGW\bin及其相关目录下。参考D:\linphone-sdk\cmake-builder\cmake\CheckBuildTools.cmake文件中的106~136行。问题在于,pkg及相关文件能正确下载到D:\linphone-sdk\build\desktop\pkg-config目录,但是拷贝到C:\MinGW\bin目录会出错,即便是cmd.exe程序以管理员方式打开也不行。 我的解决方法是,正确下载并解压的文件都在D:\linphone-sdk\build\desktop\pkg-config目录下了,直接全选并粘贴到C:\MinGW目录下即可。

再次执行cmake生成指令,cmake配置通过了。

编译

生成配置成功后,会在build目录下生成sln解决方案文件,但是不要用vs打开此文件进行编译,因为编译过程会有错误,而vs的提示无法看出问题所在,且sdk编译只给出了rule文件,并没有将源代码包含到工程中,无法看到源代码 。 在命令模式下执行以下命令即可:

cmake --build build

编译结果会生成到build目录下的inphone-sdk\desktop目录下。

  • 注意,以上指令默认生成的是debug版,要生成release版,必须执行:
cmake --build build --config release

错误的链接debug版,会导致未知错误。

编译错误处理

EP_bctoolbox.vcprj

提示EP_bctoolbox项目编译出错,但是从linphone-sdk.sln文件中无法定位问题,直接打开EP_bctoolbox.vcprj,工程,再次编译,可以双击定位到错误点。 bctoolbox/include/bctoolbox/crypto.hh文件中增加

#include <string>

EP_linphone

EP_linphone项目中的private_functions.h文件,vs中编译只是提示如下错误:

Severity	Code	Description	Project	File	Line	Suppression State
Error	C2220	the following warning is treated as an error (compiling source file D:\linphone-sdk\liblinphone\coreapi\xml.c) [D:\linphone-sdk\build\WORK\desktop\Build\linphone\coreapi\linphone-coreapi.vcxproj]	EP_linphone	D:\linphone-sdk\liblinphone\coreapi\private_functions.h	400	

看了还是不知道什么错误,双击定位到第400行,其实貌似也没啥大问题(刚开始以为是函数定义找不到,notepad++打开找了半天也没找到),但其实如果在cmd中编译,发现是这个文件编码有问题,网上找了一堆什么另存为的方式都没解决。

既然是编码问题,那一定是文件BOM出问题了,我用了一招借尸还魂,先把private_functions.h文件拷贝出去备份好,另外找了一个编码没问题的.h文件,将文件名改为private_functions.h,然后打开,将备份的private_functions.h的内容全部粘贴到这个新文件里,重新编译,成功。

同样的编码问题出现在D:\linphone-sdk\liblinphone\tester\message_tester.c文件中,但是这是在BC_ASSERT_STRING_EQUAL(text, “TBD:WHAT?”)语句中的引号中包含了不可识别的字符串导致的,我也不知道是什么,一堆乱码,先改成可识别字符(”TBD:WHAT?”)先编译过去再说。

以上改完后,全部项目编译通过。

结论

官网提供的linphone-sdk-win32-xxx的确有问题,用以上编译的x64文件替换后,项目链接成功。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据