jrtplib使用CMake進行編譯

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不一致導致。因此,主要採用了兩步解決了以上鍊接問題。

  1. 忽略默認庫。 打開cmake生成jrtplib項目下的jrtplib-static工程屬性,選擇“配置屬性”->“庫管理器”->“常規”->“忽略特定默認庫”,填充libcmt.lib;libcmtd.lib;msvcrt.lib;msvcrtd.lib;
  2. 調整代碼生成運行庫類型。打開cmake生成jrtplib項目下的jrtplib-static工程屬性,選擇“C/C++”->“代碼生成”->“運行庫”,選擇“多線程(/MT)”,與MFC的運行庫類型保持一致。

然後生成項目(ALL_BUILD),安裝(INSTALL),exampleX的5個項目可能會出問題,不用管他們,如果需要可以手動修改各自的代碼生成運行庫類型爲/MT。

再導入到MFC項目中就正常啦。

PS. 如果編譯jrtplib時沒有選擇jthread,MFC項目裏實際用的時候也不用鏈接jthread.lib。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章