2016-05-07 88 views
1

我有一個正在使用DLL的C++應用程序。現在,我想從我的應用程序中的DLL中訪問一個方法。但是,編譯器給我「無法解析的外部符號」錯誤,因爲即使DLL中的函數被正確導出,它也無法找到該方法。當我在應用程序的附加依賴項中包含相應DLL的.lib文件路徑時,錯誤得到解決,應用程序正常工作。.lib文件包含在使用DLL的應用程序中

但是,有些人告訴我,當我使用DLL時,不應該包含.lib文件。它就像靜態鏈接DLL一樣。

1)在應用程序中使用DLL時是否包含.lib文件,是不是很好的做法?

爲了避免包含這個.lib文件並避免爲每個可導出的方法調用GetProcAddess,他們建議我編寫一些包裝類並創建一個虛擬方法來從DLL中的類訪問該方法。我不明白這個方法。

2)任何人都可以解釋爲什麼我需要包裝類,以及這個抽象類如何提供我所需的功能?

在此先感謝。

+0

兄弟代碼。第42條規則:布羅告訴你什麼是最好的,但你有疑問。閱讀[文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682589%28v=vs.85%29.aspx)並證明Bro錯誤,以便他可以編寫更好的軟件。 – Drop

回答

0

使用dll時包含.lib文件被我在Windows上使用的所有共享庫使用。

重要的是要明白,在Windows平臺上,不是所有擴展名爲.lib的庫都是靜態的。 Here是一個討論,它解釋瞭如何理解.lib庫是靜態庫還是導入庫。

1

1)在應用程序中使用DLL時是否包含.lib文件,是不是很好的做法?

根據msdn您在使用dll時需要鏈接到.lib文件。當你有選擇時,考慮好或不好的做法。你沒有在這裏。

他們建議我寫一些包裝類,並創建一個虛擬的 方法來從DLL中的類訪問方法。

那麼,如果你創建一個包裝類,那麼你將不得不鏈接該包裝類與DLL,這將再次把你帶到同一個地方。

+0

不,您[不需要](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686944%28v=vs.85%29.aspx)在使用DLL時針對導入庫進行鏈接 – Drop

+0

提問者明確提到他想避免'GetProcAddess()'。這意味着他對**顯式鏈接**不感興趣** – army007

+0

我沒有看到他對哪種鏈接不感興趣。順便說一句,哪一個是明確的? – Drop

相關問題