.lib .dll .pdb 的簡單介紹,以及除錯dll原始碼
阿新 • • 發佈:2019-02-19
.lib .dll檔案都是程式可直接引用的檔案,前者就是所謂的庫檔案,後者是動態連結庫(Dynamic Link Library)也是一個庫檔案。而.pdb則可以理解為符號表檔案,下文將會提到。
對於程式引用.lib檔案一般有兩種方式:
1、動態連結
這種方式的基本原理是lib檔案中包擴了某一段程式(函式)的入口或者說是地址,而他真正的機器碼是在dll檔案中,IDE連結的時候將.lib檔案(程式地址)連結到原始碼中,程式執行時到相應位置(環境變數path,當前目錄等)尋找dll檔案並執行其中的機器碼。所以這種引用方式一般需要的檔案一般有三個:.h,.lib,.dll,生成的源程式也會比較小,因為他只儲存了函式地址,但是這種方式總是會出現找不到xxx.dll這種問題。如果這時候我們還有dll的原始碼,並且希望IED可以除錯原始碼,那麼就需要.pdb檔案了,pdb檔案中儲存了dll的符號表,所謂符號表可以理解為機器碼(這裡是dll中的)中插入的key與原始碼檔案的對映,這樣只要指定原始碼存放的路徑,IDE就會自動去找原始碼。需要注意的是,pdb檔案和dll檔案是配套的,也就是說一旦dll檔案有改動(比如說重新生成)pdb檔案就必須做相應改變。pdb檔案也比較大,程式執行時也會因為要完成對映而比較慢,這也是release版與debug的區別。
2、靜態連結:
這種方式只需要lib檔案,當然標頭檔案也是需要的。這種方式時候lib檔案中有兩個部分,可以將檔案字尾改為rar解壓可以看到。第一部分就是和第一種方式中的key,第二部分是.obj檔案儲存在obj資料夾下,他相當與dll中的機器碼,只不過這個機器碼是在連結的時候放入程式的,而不是在程式執行時拿進來的。如果這時候我們也有原始碼,並且希望IED可以除錯原始碼,這很容易因為如果lib檔案生成的時候模式是NDEBUG(好像不是也可以),obj資料夾下是有一個xx.pdb這個pdb檔案中的東西會被IED放入程式的pdb中,所以直接指定原始碼位置使用就可以了。
對於引用dll:
上文的第一種方式是一種使用dll的方式,還有一種方式是呼叫windows的api LoadLibrary來載入dll,並根據標頭檔案呼叫GetProcAddress 載入dll中的函式,最後使用FreeLibrary釋放,這種方式顯然不可以除錯。
對於程式引用.lib檔案一般有兩種方式:
1、動態連結
這種方式的基本原理是lib檔案中包擴了某一段程式(函式)的入口或者說是地址,而他真正的機器碼是在dll檔案中,IDE連結的時候將.lib檔案(程式地址)連結到原始碼中,程式執行時到相應位置(環境變數path,當前目錄等)尋找dll檔案並執行其中的機器碼。所以這種引用方式一般需要的檔案一般有三個:.h,.lib,.dll,生成的源程式也會比較小,因為他只儲存了函式地址,但是這種方式總是會出現找不到xxx.dll這種問題。如果這時候我們還有dll的原始碼,並且希望IED可以除錯原始碼,那麼就需要.pdb檔案了,pdb檔案中儲存了dll的符號表,所謂符號表可以理解為機器碼(這裡是dll中的)中插入的key與原始碼檔案的對映,這樣只要指定原始碼存放的路徑,IDE就會自動去找原始碼。需要注意的是,pdb檔案和dll檔案是配套的,也就是說一旦dll檔案有改動(比如說重新生成)pdb檔案就必須做相應改變。pdb檔案也比較大,程式執行時也會因為要完成對映而比較慢,這也是release版與debug的區別。
2、靜態連結:
這種方式只需要lib檔案,當然標頭檔案也是需要的。這種方式時候lib檔案中有兩個部分,可以將檔案字尾改為rar解壓可以看到。第一部分就是和第一種方式中的key,第二部分是.obj檔案儲存在obj資料夾下,他相當與dll中的機器碼,只不過這個機器碼是在連結的時候放入程式的,而不是在程式執行時拿進來的。如果這時候我們也有原始碼,並且希望IED可以除錯原始碼,這很容易因為如果lib檔案生成的時候模式是NDEBUG(好像不是也可以),obj資料夾下是有一個xx.pdb這個pdb檔案中的東西會被IED放入程式的pdb中,所以直接指定原始碼位置使用就可以了。
對於引用dll:
上文的第一種方式是一種使用dll的方式,還有一種方式是呼叫windows的api LoadLibrary來載入dll,並根據標頭檔案呼叫GetProcAddress 載入dll中的函式,最後使用FreeLibrary釋放,這種方式顯然不可以除錯。