2013-09-16 41 views
1

當前我正在寫一個cpp-DLL。 Afaik如果另一個cpp程序想要使用它們,我必須將這些函數放入一個類和一個命名空間中。但我也想用Labview來使用DLL。如果Labview是免費的,Labview僅識別這些功能,例如既不在名稱空間中,也不在類中。我如何在我的DLL中實現這個?目前,我已經設置了一個#define變量。如果設置了這個變量,函數被封裝在一個命名空間和一個類中,如果沒有,那麼它們是免費的,但我必須編譯整個事情兩次,我得到兩個單獨的DLL文件。那麼,如果我只需要兩個應用程序的一個DLL文件,我該怎麼辦? (請不要告訴我兩次寫這些函數,管理費用更糟,我之前已經嘗試過)。 或者我不必在不使用名稱空間時通過LoadLibrary()調用DLL?
非常感謝!爲cpp創建一個沒有命名空間的dll

+1

您不需要使用類或名稱空間,以使您的DLL可用於其他C++項目。你從哪裏得到這個想法?你應該做的是無條件地將DLL函數作爲自由函數導出,然後爲C++編譯器提供一個單獨的包裝類(如果需要的話)。你只需要1個DLL(除非你正在編譯32位和64位)。 –

+0

http://msdn.microsoft.com/de-de/library/ms235636.aspx從這裏 –

+0

@arc_lupus這解釋瞭如何將**類**添加到.dll。如果你不需要課堂,請不要添加課程。只需使用'extern「C」'輸出符號。另請閱讀[導出用於C或C++語言可執行文件的C函數](http://msdn.microsoft.com/zh-cn/library/ys435b3s.aspx)。 – IInspectable

回答

0

Afaik如果另一個cpp程序想要使用它們,我必須將這些函數放到一個類和一個命名空間中。

這顯然是錯誤的。你根本不需要這樣做。相反,DLL最初是作爲C函數的庫引入的。 C++使用重名名稱來表示命名空間/類和參數類型。這方面沒有標準。不同的編譯器使用他們自己的方案。

總結:

  • 如果您從DLL導出簡單的C函數,這將始終工作。
  • 如果您從命名空間導出類或其他東西,如果使用相同版本的 編譯器編譯了其他.exe/.dll,則 肯定會起作用。如果不是 - 這取決於。

關於LoadLibrary:它應該被用來當你不知道該DLL的名稱,或在此DLL中的函數前面的名字,或當你不想在你的進程開始加載這個DLL 。否則(簡單情況下)將您的可執行文件與該DLL的implib鏈接起來。這完美適用於簡單的c函數。由於某些原因,直接鏈接不好時應使用LoadLibrary

+1

從DLL中導出C++類非常不穩定。一般來說,只有當你保證它能夠工作的時候,你並不需要它(使用靜態庫或只是將源文件添加到項目中)。 http://stackoverflow.com/questions/12314101/creating-c-dll-without-static-methods/12314276#12314276 – tenfour

+0

這是當你使用LoadLibrary:1.你想要的選項不加載DLL,或2。你無法保證它在圖書館搜索路徑上的存在。 –

相關問題