2017-07-07 61 views
1

我們構建的第三方軟件,通常做的是而不是以任何方式修改都有一些奇怪的行爲:由於它構建爲靜態庫,因此它創建的PDB文件稱爲vc.pdb,位於軟件'中間文件夾。現在它創建了大約12個這樣的pdb文件,所有這些文件都位於不同的文件夾中,並且對於不同的庫和不同的配置都有相同的名稱用visual studio可用工具重命名pdb文件?

當我們將第三方軟件集成到我們的代碼中時,我們得到了LNK4099警告,因爲pdb的烘焙路徑在所有機器上顯然不存在。由於第三方軟件在一個輸出目錄中生成多個.lib文件,因此我們不能將vc < ...> .pdb文件與它們一起放置。

所以我正在尋找一種方法來修補在pdb名稱中烘焙的lib文件,使其可以在我的控制之下。 Visual Studio構建工具是否提供了一種方法來執行此操作?

編輯:讓我更詳細地解釋我們在做什麼: 我們決定在我們的項目中集成一些第三方靜態庫。該項目本身就是一個源代碼包。一個開發人員或構建服務器或構建此源代碼包的人員可以在各種構建配置中生成名爲a.lib和b.lib的靜態鏈接庫。有了它們,默認的visual studio配置會生成vc110.pdb文件,因爲它們被調用完全一樣,VS會自動將它們放到$(IntDir)中。所以pdb文件都在這個地方。 現在我們將這些第三方二進制文件提交給我們針對給定項目X的VCS。 現在在項目X中使用靜態庫的人必須將它們鏈接到最終的二進制文件中。這是生成LNK4099的時間,因爲pdb文件不在VCS中,並且在本機上不可用。

但是我們實際上不能提交所有的vc110.pdb文件,因爲這是無用的。由於完全限定路徑被構建到靜態庫中,因此其他用戶將無法複製該路徑。在鏈接期間,無法找到PDB的完整路徑,因此它會在lib文件的位置中查找vc110.pdb。 由於第三方軟件包決定將.lib和b.lib放在同一個目錄中,除非我們修改第三方軟件包的構建並重命名vcxproj中的pdb文件,否則我們永遠不能正確放置pdb文件。或者將庫的生成拆分到不同的目錄中(也在vcxproj中)。

這就是要點:我想不是隨時修改第三方的構建文件,我希望能夠使用這個第三方軟件包的簡單新鮮下載,並用一些「簡單的「批處理腳本。 這個包的默認結果是:

/Bin 
    /Debug 
     a.lib 
     b.lib 
    /Release 
     a.lib 
     b.lib 
/Temp 
    /A 
     /Debug 
      vc110.pdb 
     /Release 
      vc110.pdb 
    /B 
     /Debug 
      vc110.pdb 
     /Release 
      vc110.pdb 

我真正想要的是修補生成的文件構建之後。 我的「簡單」批處理(或其他)腳本可能會將pdb文件重命名爲a.pdb和b.pdb,這當然是不夠的,因爲鏈接器仍然會查找vc110.pdb,在名義上。這就是爲什麼我正在尋找一種方法(通過像lib或dumpbin等工具),在這裏我可以將生成的庫修補到新的pdb名稱。

就像是:

$ magic /showPDB a.lib 
> D:\some_users_machine\unique_path\package\Temp\A\Debug.vc110.pdb 

$ magic /newPDB a.lib d:\path\a.pdb 
> New PDB name is d:\path\a.pdb 

當消費者再聯繫我修補A.LIB它不會試圖尋找a.pdb在上面的路徑。當然在大多數機器上也找不到,但是鏈接器也會在a位置尋找a.pdb。lib的位置,那就是我現在可以把它放在所有的位置。

編輯2:對於接近,由於民意基礎:我在尋找一個技術的方式來修改靜態庫在PDB位置

+0

好,而重要的是,它以這種方式工作。 * final * pdb文件需要匹配可執行文件(dll或exe)。但是當你使用一個靜態庫項目時,這個延遲必須被推遲,在圖書館被鏈接之前,踏板不符合金屬。此時,vcxyz.pdb文件中的調試條目將合併爲最後一個。當產生鏈接器警告時,你顯然做錯了什麼,你不知道可能會發生什麼。首先關注如何爲* one *配置獲得這個權利,其餘的可以等待。 –

+0

@HansPassant我更新了原文,以澄清我在做什麼。 – Samuel

回答

0

出爐看看鏈接器選項/ PDBALTPATH。這使您可以指定將嵌入到二進制文件中的不同PDB路徑。

/PDBALTPATH:pdb_file_name 

MSDN Article: /PDBALTPATH (Use Alternate PDB Path)

+0

感謝您的回覆。然而,我的問題是在構建之後發生的。我沒有構建靜態庫,所以我不能在它們上設置任何/ PDBALTPATH,因爲它們不是由我維護的,我正在尋找一種方法來修改它們之後烘焙到它們的pdb路徑。 – Samuel

+0

/PDBALTPATH實際上是在您的二進制文件的鏈接時設置的。但它可能不會做你想做的,這是改變靜態庫的PDB的名稱。您可以使用LIB/EXTRACT提取lib,然後手動編輯路徑,但我不確定這是否會工作,因爲我沒有這樣做。 – syplex

相關問題