簡體   English   中英

使用Visual Studio 2013為本地DLL正確生成PDB文件

[英]Generating PDB files correctly for a native DLL using Visual studio 2013

昨天,我瀏覽了我們公司的項目,並對其進行了更新,以解決如何配置它們的錯誤(AFAIK)。

問題在於,在項目的屬性頁下的“ Configuration Properties -> C/C++ -> Output Files ,我們將“ Program Database File Name設置為$(OutDir)$(TargetName).pdb ,該值與我們設置“ Configuration Properties -> Linker -> Debugging -> Generate Program Database File相同 Configuration Properties -> Linker -> Debugging -> Generate Program Database File

我的理解是,第一個屬性設置pdb文件的位置,該文​​件包含在源代碼編譯期間創建的目標文件的符號,而第二個屬性設置pdb文件的位置,其中包含用於生成的DLL的符號。 那是對的嗎?

在這種假設下,為防止它們發生沖突(我認為這是不必要的),我將第一個屬性設置為$(IntDir)$(TargetName).pdb ,但這會破壞生成的pdb文件(即調試器無法將其識別為DLL的pdb文件,並且同事在其上運行了一個工具,並且簽名與二進制文件中包含的簽名不匹配)。

奇怪的是,使用值$(IntDir)$(TargetName)2.pdb (注意后綴2)解決了該問題。 我不明白為什么中間文件的名稱很重要?

請注意, Configuration Properties -> C/C++ -> General -> Debug Information Format設置為Program Database (/Zi)

我想說的沒錯:編譯器生成目標文件。 那時DLL還沒有准備好,所以無論PDB文件包含什么,它都對調試沒有幫助。

鏈接器處理了編譯器的輸出后,該DLL存在。 那時,PDB對於調試很有意義。 因此,用於調試目的的相關文件位於Linker -> Debugging -> Generate Program Database File

正如@HansPassant在評論中提到的那樣,不應更改編譯器設置。 太糟糕了,它已經發生了。 在Visual Studio 2013或2015 C ++控制台應用程序中, C/C++ -> Output Files的默認值為$(IntDir)vc$(PlatformToolsetVersion).pdb ,因此最終名稱類似於Debug\\vc120.pdbDebug\\vc140.pdb

恕我直言,只要名稱不與鏈接器設置沖突,更改編譯器的輸出文件就沒有關系。 這就是發生的事情:編譯器名稱$(IntDir)$(TargetName).pdb (相對路徑)解析為與鏈接器名稱$(OutDir)$(TargetName).pdb (絕對路徑)相同的文件。 在這種情況下,鏈接器可能無法寫入文件,因為編譯器或其他奇怪的東西仍在使用它。

暫無
暫無

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

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