VC靜態庫的除錯

2021-07-22 08:20:29 字數 1403 閱讀 7383

對於動態庫或者可執行程式而言,如果想要除錯只要將對應的pdb檔案和動態庫或者可執行檔案放在一起即可自動載入符號。

眾所周知靜態庫在最終鏈結的時候是把**直接鏈結到最終的生成檔案裡的。這就決定了不可能把靜態庫的pdb檔案和生成檔案放在一起來除錯。所以我們想要除錯靜態庫,肯定需要一些特殊的操作。

那麼,對於靜態庫除錯,具體該怎麼做呢?

首先我們確定一件事,靜態庫有沒有pdb檔案。答案當然是有的,但是動態庫或者可執行檔案的pdb檔案都是在生成目錄裡,和生成檔案放在一起,而在靜態庫的生成目錄裡是找不到pdb檔案的,靜態庫的pdb檔案是在中間目錄裡的,和obj檔案在一起。

還有一點要注意的是靜態庫pdb檔案的名字,一般預設都是叫vc***.pdb,而不是像動態庫或者可執行檔案那樣和生成檔案名字一樣。

靜態庫的pdb檔案不能直接載入,那麼靜態庫的除錯資訊到底是怎麼使用的呢?

眾所周知靜態庫的**直接鏈結到最終的生成檔案裡的,那麼是不是除錯資訊也合併到最終的生成檔案的pdb檔案裡呢?

的確如此,鏈結器在連線的過程中會將靜態庫的pdb檔案中被用到的除錯資訊解析出來然後合併到最終的生成檔案的pdb檔案裡。

那麼鏈結器是怎麼找到靜態庫的pdb檔案的呢?是因為編譯器在編譯靜態庫的時候直接將pdb檔案的絕對路徑寫在了obj檔案裡。鏈結器通過這個資訊就可以找到靜態庫的pdb檔案。

但是這就有個問題,如果把靜態庫發給別人使用,那麼pdb檔案路徑不就失效了嗎?沒關係,鏈結器鏈結的時候如果找不到絕對路徑的pdb檔案還會搜尋和靜態庫lib檔案放在一起的和原pdb檔案同名的pdb檔案。

這就引出了乙個新的問題,所有的靜態庫的預設pdb檔案名字都是一樣的,如果把幾個靜態庫放在一起pdb檔案就會衝突。所以我們要設定靜態庫的pdb檔名。通常我們設為和庫名一致。

綜上所述,想要除錯靜態庫只要保持靜態庫的pdb檔案位置不變或者將靜態庫的pdb檔案和靜態庫lib檔案放在一起,然後正常鏈結。除錯資訊就被包含到了最終生成的檔案的pdb檔案裡,需要除錯的時候直接載入最終生成的檔案的pdb檔案,和正常除錯動態庫或者可執行檔案一樣。

vc的靜態庫依賴

技術部落格 vc編譯的靜態庫.lib檔案是一系列.obj檔案的集合,這點和linux系統上的靜態庫一致,但是vc的靜態庫有乙個獨有的功能,強制這個靜態庫的使用者必須鏈結某個庫。這點在靜態庫已經有很複雜的依賴關係或者需要強制鏈結某個版本的庫時及其有用。否則,如果靜態庫中用到了其他的庫,需要這個靜態庫的...

VC 載入動態庫和靜態庫

靜態庫包括.lib和.h檔案,在工程中使用靜態庫分為3步 1在工程中加入靜態庫,有兩種方法 方法一 專案設定中引用.lib,project setting link object library modules中新增.lib 需要在tools options設定正確的引用路徑 方法二 在專案中直接加...

關於VC 中靜態庫的呼叫

關於vc 中靜態庫的呼叫 這個靜態庫是通過 通過生成嚮導選擇win32 static library建立的。在這個庫的生成嚮導中有兩個選項 pre compiled header 是在生成的工程中新增 stdafx.h 預編譯標頭檔案 mfc support 是在生成的工程中新增對mfc的支援,也就...