首页 > 学院 > 开发设计 > 正文

jrtplib使用CMake进行编译

2019-11-10 19:06:45
字体:
来源:转载
供稿:网友

jrtplib版本是3.10.0,cmake版本3.7.2,cmake使用的编译器(Native Compilers)是Visual Studio 14 2015(v140),IDE版本是Microsoft Visual Studio Community 15.

这两天研究jrtplib的编译和使用,本身在Console控制台环境下已经通过了。但是将jrtplib联立到MFC中,则出现了死活编译不过的情况。大致的报错如下:

> jrtplib_d.lib(rtPRandomrands.obj) : error LNK2019: 无法解析的外部符号 __imp__rand_s,该符号在函数 "public: virtual unsigned char __thiscall jrtplib::RTPRandomRandS::GetRandom8(void)" (?GetRandom8@RTPRandomRandS@jrtplib@@UAEEXZ) 中被引用> jrtplib_d.lib(rtprandom.obj) : error LNK2019: 无法解析的外部符号 __imp___getpid,该符号在函数 "public: unsigned int __thiscall jrtplib::RTPRandom::PickSeed(void)" (?PickSeed@RTPRandom@jrtplib@@QAEIXZ) 中被引用> msvcrtd.lib(_chandler4gs_.obj) : error LNK2019: 无法解析的外部符号 __except_handler4_common,该符号在函数 __except_handler4 中被引用

在MFC工程中,我确定正确设置了附加依赖库和库路径位置,因此只可能是jrtplib本身的编译存在问题。

经查阅资料,发现主要是MFC底层依赖了libcmt.lib(Release)/libcmtd.lib(Debug)和msvcrt.lib(Release)/msvcrtd.lib(Debug)库,jrtplib代码生成的运行库类型和MFC不一致导致。因此,主要采用了两步解决了以上链接问题。

忽略默认库。 打开cmake生成jrtplib项目下的jrtplib-static工程属性,选择“配置属性”->“库管理器”->“常规”->“忽略特定默认库”,填充libcmt.lib;libcmtd.lib;msvcrt.lib;msvcrtd.lib;调整代码生成运行库类型。打开cmake生成jrtplib项目下的jrtplib-static工程属性,选择“C/C++”->“代码生成”->“运行库”,选择“多线程(/MT)”,与MFC的运行库类型保持一致。

然后生成项目(ALL_BUILD),安装(INSTALL),exampleX的5个项目可能会出问题,不用管他们,如果需要可以手动修改各自的代码生成运行库类型为/MT。

再导入到MFC项目中就正常啦。

PS. 如果编译jrtplib时没有选择jthread,MFC项目里实际用的时候也不用链接jthread.lib。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表