簡體   English   中英

使用發行版EXE調試DLL

[英]Debug DLL with release EXE

是否可以使用發布模式EXE執行調試模式DLL?

我正在嘗試這種情況,但EXE不加載調試DLL並拋出錯誤“此應用程序無法啟動...”。

我知道這不是好事,但由於某些要求,我必須做到這一點。

如果您的dll接口對調試和發布中可能看起來不同的類沒有依賴關系,它可以工作。 例如,MSVC中的std :: string和std :: vector在調試和發布中不兼容。 (柵欄......)

所以舉個例子

std::string GetName();

不管用。

另外new和delete不應該被移位,因為調試/發布使用不同的運行時。 但無論如何,你應該總是delete在同樣的情況下(DLL / EXE)作為new

是的,這可以工作。

您的“應用程序無法啟動”問題很可能是您將DLL的調試版本(使用Visual Studio在您的計算機上構建)復制到未安裝DEBUG CRT的計算機上。 通常將MSVCRTD(版本).dll復制到與程序文件相同的目錄中可以解決此問題。 我有一個以前的答案,涵蓋一些這這里

最好的辦法是始終將所有二進制文件鏈接到相同的動態MSVCRT DLL,以便它們共享相同的運行時。

另一個簡單的解決方法是編譯您的DEBUG DLL以使用相同的MSVCRT DLL(或靜態鏈接到CRT)。 VS項目中的某個地方(我認為代碼生成)是選擇CRT的下拉列表。 將零售MSVCRT鏈接到調試DLL或靜態鏈接沒有任何問題。

需要注意的是,當您將不同類型的調試C運行時鏈接到不同的二進制文件時。 如果你有發布的MSVCRT dll為EXE鏈接,但是為DLL調試MSCVRTD DLL,那可能會在一些情況下引起問題。 這是因為句柄和內存塊由兩個不同的CRT實例跟蹤。

例子:

  1. 如果在EXE中分配內存,但在DLL中釋放。 反之亦然。

  2. 在EXE中使用fopen()打開文件句柄,但在EXE中使用或關閉(反之亦然)。

  3. 對於DLL接口的任何頭文件,在頭文件中實現任何類型的內聯函數或方法都是導致#1或#2發生的簡單方法。

  4. 共享STL對象(std :: string,std :: list,std :: vector)對於混合CRT使用是一個明確的禁忌。

暫無
暫無

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

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