CSAPP學習筆記(二)鏈結問題

2021-09-22 09:57:53 字數 1750 閱讀 8071

鏈結器報告無法解析的引用是什麼問題?

error lnk2019: 無法解析的外部符號是常見的鏈結問題,通常原因在於雖然包含了標頭檔案,但是鏈結的時候無法找到相應的庫。在vs中,需要在設定內指定庫的位置和庫的名稱才可以。

靜態變數和全域性變數的區別是什麼?

全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見

tips:

a.若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b.若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c.設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;

d.如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶「內部儲存器」功能的的函式)

e.函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。

如果在兩個不同的c檔案定義了名字相同的全域性變數會怎麼樣?

重複定義會導致鏈結的時候出錯。如果重複宣告則不會。

靜態庫和動態庫的區別是什麼?

靜態庫之所以稱為【靜態庫】,是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。其實乙個靜態庫可以簡單看成是一組目標檔案(.o/.obj檔案)的集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。靜態庫特點總結如下:

(1)靜態庫對函式庫的鏈結是放在編譯時期完成的。

(2)程式在執行時與函式庫再無瓜葛,移植方便。

(3)浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案

由於靜態庫存在浪費空間和資源以及對程式的更新、部署和發布頁會帶來麻煩,因此又有了動態庫。動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題。動態庫在程式執行時才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。

動態庫特點總結:

(1)動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期。 

(2)可以實現程序之間的資源共享。(因此動態庫也稱為共享庫)

(3)將一些程式公升級變得簡單。

(4)可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)。

命令列上排列庫的順序有什麼影響?

庫的鏈結順序是從左向右,因此有依賴關係的需要注意先後順序。

為什麼有些鏈結錯誤直到執行時才會出現?

這種問題通常在使用動態庫的時候出現,因為編譯僅檢測了動態庫是否可以鏈結,但是動態庫可能依賴於其他的一些庫,然而這些庫並沒有正確找到因而出錯。

參考文獻:

(1)(2)

(3)(4)

《Csapp》學習筆記 1

andrew,gz,2013 3 17 資訊是 位 上下文 也就是說,資訊在計算中如此表達,由多個有序位 bit 及其值 0或1 組成的整體。圖表 1 編譯系統 1.預編譯階段 輸入的是c語言的原始檔,通常為 c。它們通常帶有.h之類標頭檔案的包含檔案。這個階段主要處理原始檔中的 ifdef inc...

CSAPP 15 231 學習筆記一

左移因而下面的表述也都是正確的 include printf d unsigned int max int min 1 printf d 1 2 1 printf d int max 1 unsigned int max 1 1 乙個容易被忽視的案例 u max 2 t max 1 擴充套件無符號數...

CSAPP閱讀筆記(二) 位元 位元組和整數

用位元來表示資訊每個位元只能是0或1,也就是二進位制。一方面有利於計算機的儲存,另一方面也適合電子裝置的傳輸 扛干擾能力更強 資訊編碼成多個位元構成的串後,計算機通過解析來判斷是指令還是資料 數字 集合 字串等 來實現預定的目標。1個位元組由8個位元構成。一般而言,char型整數由1個位元組構成,s...