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。