將webrtc的p2p模組編譯成dll並移植到qt

2021-07-30 22:52:18 字數 1182 閱讀 3145

之前使用webrtc的原始碼和依賴庫寫好了p2p檔案傳輸的dll,qt mingw編譯器是不識別msvc編譯的dll的,初步想法是使用qt自帶的載入dll的函式去載入dll中的匯出函式介面,不得要傳給qlibrary對應api匯出函式在dll中對應的函式符號,大家都知道如果不是用純c的方式(extern "c")修飾匯出函式,編譯器在匯出函式、類到dll中的時候,根據呼叫約定(__stdcall 、 __cdcel)會在函式符號名新增特定的字元,結果dll中的匯出函式的名字和原來的名字發生了很大的差別,所以如果匯出dll和匯入dll的兩個編譯器是相同的那沒問題,函式符號都是按照固定的格式去修飾的,平常的方法都是直接引入dll,然後顯式或者隱式呼叫dll中的介面,但是當匯出dll和匯入dll的編譯器不一樣,就不能按照平常的方式去使用dll了,所以就需要用到extern "c"來修飾匯出函式,我使用__cdcel的呼叫約定,為了最大程度地支援c,畢竟dll就是以c作為設計目標的。如此做後,重新在vs2015中編譯dll,將得到的dll新增到qt的pro檔案中,很慶幸,dll中的函式的函式符號和原始碼中的是一樣的,所以我不打算使用qlibrary顯示去呼叫dll中的函式了,直接使用隱式的方式呼叫,居然變得和在vs中呼叫dll的時候一樣,這聽起來確實有點前後矛盾,可事實就是這樣!

dll能夠正常匯入到qt專案工程中去了,這沒什麼值得高興的!沒準呼叫的dll還是有問題呢,結果還真是!因為dll不是在同乙個編譯器匯入和匯出,不同的編譯器對非基本資料型別的處理,不一樣,這也只是猜測,現未證明!就像是你感覺到山洞裡黑乎乎很嚇人而不敢進去一樣,我之所以有這個想法也是遇到了一些具體的事情,比如,我在dll的乙個介面函式中使用了std::string型別作為引數型別,我在vs裡面呼叫此介面沒有任何問題,可是當我在qt中建立了乙個std::string物件並將此物件作為引數傳進此介面的時候,程式會莫名崩潰、閃退,檢視除錯資訊知道是記憶體和堆疊出了問題,同樣是std::string 型別,不同編譯其中的記憶體處理確實是不一樣的,可能我qt中的std::string一傳進dll中去,dll對此std::string的處理破壞了此std::string的堆疊布局呢?也許吧,留待回去驗證!於是在vs2015中重新設計匯出函式,將所有匯出介面中使用到的std::string全部用基本資料char*代替,基本語言型別在各個編譯系統下被處理的方式就是相容了吧,修改後匯出dll,在qt中匯入測試,問題解決!

在跨平台的時候盡量使用c的介面方式,在匯出介面的時候,最好使用語言的基本型別,非語言標準的型別在介面傳參的時候會有**煩!

P2P業務模組

p2p網貸最大的優越性,是使傳統銀行難以覆蓋的借款人在虛擬世界裡能充分享受貸款的高效與便捷。網貸平台數量近兩年在國內迅速增長,迄今比較活躍的有350家左右。由此可見網貸平台發展前景還是很可觀的。那麼p2p 系統的整體結構又是怎樣的呢?網貸p2p 系統主要由 前台模組 個人中心模組 後台管理模組三大模...

認識P2P,利用P2P

是peer to peer的縮寫 好象還看到過文章說是point to point,我也不清楚,網上的資料也不清楚,鬱悶 peer在英語裡有 地位 能力等 同等者 同事 和 夥伴 等意義。這樣一來,p2p也就可以理解為 夥伴對夥伴 的意思,或稱為對等聯網。目前人們認為其在加強網路上人的交流 檔案交換...

P2P網路模型

1 靜態配置模型 靜態配置模型是一種相對靜態而簡單的對等點定位模型。在該模型中,每個對等點都確切地知道存在於其p2p 網路中其它對等點的位置以及它們所提供的共享資源內容。缺點 網路無法應付不能預知的隨機事件和臨時變更,比如對等點隨機進入和退出網路。優點 整個網路在外部攻擊面前表現得很穩固。2 動態配...