簡體   English   中英

將DLL C ++類庫移植到Visual Studio的問題

[英]issues with porting a DLL C++ class library to Visual Studio

我用C ++編寫了一個類庫,並使用g ++作為共享對象在Linux中成功編譯了它,然后創建了一些使用它的應用程序。 現在我必須將它移植到VS2008。 我給了所有類所需的__declspec(dllexport)前綴,然后嘗試編譯它。 我得到一堆警告,基本上與以下有關:

  1. 我的自定義異常類,派生自std :: runtime_error,它產生:“警告C4275:非dll接口類'std :: runtime_error'用作dll接口類'cci :: FileOperationException'的基礎”。 我怎么能讓標准庫類dll-exportable?
  2. 成員函數聲明中的異常規范,導致“警告C4290:忽略C ++異常規范,但指示函數不是__declspec(nothrow)”。 我讀到某個地方,VS不支持這些,並且它在其他地方。 多么令人困惑。

我讀到人們說在DLL中導出類通常是一個壞主意,有無數的東西可能出錯,現在我的頭腦中充滿了二進制不兼容,dll地獄,編譯器版本不匹配等概念,以及說實話,我不能真正做出正面或反面。 那么在Windows中創建共享類庫的正確,安全和簡便的方法是什么?

謝謝。

我維護一個C ++類庫 ,通常在Windows上用作DLL,因此可以完成。 關於你的問題:

  1. 這不會發生在我的圖書館。 也許您需要使用/ MD和/ MDd構建選項? 這樣你的C ++運行時庫也來自DLL,這是VC ++着名的那種挑剔的東西。

  2. 不要使用throw-specs。 他們是邪惡的 如果您認為必須這樣做,只需將這樣的內容放在每個模塊包含的頭文件中,然后再使用throw-specs代碼。

#pragma warning(禁用:4290)

首先,你應該問自己,你真的需要一個動態庫。 靜態庫或甚至更好地直接在項目中包含源代碼是一個很好的解決方案,沒有這些問題。

如果你真的需要DLL,我會這樣做(給定很多時間)將你的類包裝在C接口中。 然后,您可以將舊的C ++接口重新創建為僅與C ++標頭庫相互作用,該庫僅與從DLL導出的C調用進行交互。 這種方法的一個額外功能是,從幾乎任何編程語言中使用您的庫都是微不足道的,因為從DLL中導入C函數是非常受支持的。

另一種方法是使用COM,但由於你從Linux移植,這可能不是一個選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM