據我所知,我需要添加__declspec(dllexport)到每個標頭 我打算使用的文件聲明。這似乎很乏味,但它是 可行。
你應該做的是建立在你的DLL的頭文件中的#define映射時,報頭由DLL項目編譯DLLEXPORT和地圖在其他項目編制時的DllImport。例如:
#ifndef MyDLLH
#define MyDLLH
#ifdef _BUILDING_DLL_
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
MY_EXPORT type callingconvention SomeFunc(parameters);
#ifdef __cplusplus
}
#endif
#endif
然後你就可以在你的只有DLL項目定義_BUILDING_DLL_,無論是在項目選項的條件語句列表,或在你的代碼上面的頭文件中的任何#include語句,如:
#define _BUILDING_DLL_
#include "MyDll.h"
如何獲取應用程序+ DLL運行?
DLL項目生成一個.lib文件,用於靜態鏈接到DLL的導出函數。您可以將.lib文件添加到您的EXE項目中,然後像調用其他任何函數一樣調用DLL函數。或者,您可以使用Win32 API LoadLibrary()和GetProcAddress()函數在運行時動態加載DLL函數,在這種情況下,根本不使用.lib文件。
在一個簡單的測試項目中,我發現的唯一方式的工作原理是 從DLL項目的構建輸出目錄下的DLL手動複製到 的exe項目的構建輸出目錄。
EXE文件夾是操作系統查找DLL的第一個位置,但它不是操作系統可以查看的唯一位置。MSDN文檔如何DLL被定位在運行時:
Dynamic-Link Library Search Order
我知道我可以設置生成後步驟來做到這一點,但是我希望在 IDE有一些方法來自動化其當一個應用程序項目屬於同一個項目組時,應用程序項目會使用DLL項目 。
只是作爲同一項目組的一部分是不夠的。這些項目是獨立編譯的。但是,您可以設置DLL項目爲EXE項目的扶養(或只需確保DLL projct是構建順序那麼EXE項目上上漲),因此DLL首先編譯,然後使用DLL的PostBuild事件移動編譯後的.lib和.dll二進制文件,最後將DLL的編譯後的.lib文件添加到EXE項目中,以便在運行時使用該DLL。
如何調試應用程序的DLL +?
你有兩個選擇:
要單獨調試只是DLL,DLL項目加載到IDE中,進入運行參數,並設置編譯EXE在主機應用程序。然後,您可以像運行EXE項目一樣運行DLL項目。 EXE將被執行,並且一旦將DLL加載到內存中,調試器就會連接到DLL。
要在同一時間調試這兩個項目中,EXE項目加載到IDE替代,並確保該DLL的源文件夾中的項目選項的調試周守軍指定路徑。然後,您可以正常運行的EXE工程,DLL的源步入DLL函數被調用時,設置斷點等
,我發現必須在同一時間調試這兩個項目一個額外的步驟:複製' .tds'文件(調試器符號)從DLL輸出目錄移動到「.dll」文件將駐留在應用程序的任何位置。 – 2012-02-10 19:48:30
@喬什 - 凱利:我已經能夠不復制,如果我設置了'.exe'項目的「工作目錄」包含了'.dll'和'.tds'文件的路徑,可以同時調試。在C++ Builder XE下,在「項目選項」>「調試器」下找到「工作目錄」選項。 – Pete 2013-03-19 17:30:31