vs2019 c 開發的dll可以給vs2010開發的exe呼叫嗎?

時間 2021-05-06 14:06:06

1樓:向陽

首先第乙個問題,要明確dll裡面匯出的函式有哪些修辭:

extern "C"

僅此?並不,dll匯出函式應該都是__stdcall的。ok,看我們保證了什麼東西一致:活動記錄布局和符號名。

有了這兩個,就可以保證用VS2019、GCC9.x這些編譯的dll給VC++6.0這種大學特配軟體寫的程式用。

當然你說我不要stdcall我要fastcall、我不要什麼extern "C",這隨意,只需要保證符號名和活動記錄布局一致就行了。

但是,C++還有乙個東西要考慮——STL。因為各個編譯器廠商以及C++版本對STL的要求、實現有細微差異,因此可能導致嚴重問題。類似的,不要返回乙個new的物件,然後交給外部的宿主delete等等。

那怎麼辦呢?別在引數上用STL型別,什麼void exportfun(std::vector &x)就不要搞了。

最後乙個問題,C++異常。理論上來說,應該保證匯出函式不丟擲異常。

末尾是個人的防坑建議,1 最好extern 「C」而不是C++類,如果非要用C++類請以COM或者類似COM的方式匯出介面。以上。

2樓:acebear

同意 @breaker 的看法。

如果呼叫介面不複雜,用 extern "C" 風格的呼叫最為便利,純C風格的不涉及C++,而且簡單。

如果呼叫非常複雜,可以考慮用 COM 元件形式,這是酒精考驗過的,畢竟DirectX一堆東西就是這麼用的,這麼多年了一直相當穩定可靠

另外,還有一種自定義協議式的,還沒有人提到,就是你自己定義乙個你自己的簡單協議,然後通過 「管道/共享記憶體/網路(如127.0.0.1/::1回環網路)」某種通訊機制來相互溝通

如果在dll中匯出C++的類,可能會有問題,給你報「找到不符號」... 之類的

3樓:若水

只要確保兩者之間的介面傳遞資料全用基礎型別且介面extern "C"基本問題不大,無非就是兩套不同的執行時,別說不同版本的MSVC,就是MSVC和MinGW一塊開發也是很常見的場景。

如果非要傳遞C++的資料型別,那不僅編譯器版本一致,C++的版本也必須完全一致,比如說MSVC C++17 std::string的資料結構就有變動,如果不同版本相互傳遞那直接程式就崩掉了。

C 開發v s 大資料開發,做何選擇?

這麼說吧,大資料開發一般來說大致會做大資料領域相關的工作。但是如果校招崗位上寫的是C 開發,那具體做什麼 接觸什麼領域,甚至是用什麼語言都是不確定的 非貶義 所以就算是去了C 開發也不用把自己的職業規劃限制在C 上,唯一能建議的就是走一步看一步。C 工作機會和待遇都比不了大資料,研究生的話往大資料方...

如何評價VS2019現在可以使用C 20的完整特性?

我心心念念的std format竟然真的放到了最後才實現。絕了。另外,C 20的std range是真的殘廢啊,連個ranges to 都沒有,乙個vector處理完列印個型別能給我輸出好幾行 玩個錘子。沒宣布 ABI 凍結,看來 STL 和 boss 的挑戰是 STL 獲得勝利。Edit 根據 S...

Linux 下的 C 開發和 Windows 環境下的開發有什麼區別?

張杰 1 開發環境 2 系統 API 3 第三方庫 一年前,13年我做Windows底層開發,常用的技術與工具庫 C C STL POCO BOOST,Python,lua,gTest,VS,Notepad 目前做遊戲開發,常用的技術與工具庫 C C STL BOOST,Python Shell A...