徹底理解鏈結器 一,概念

2021-10-08 15:19:41 字數 1053 閱讀 7944

在介紹本章的主題之前,我們先來看幾個問題:

問題一寫c/c++的同學應該經常遇到這樣的乙個error:

undefined reference to abc

在遇到這樣的問題時你知道這背後到底**出問題了嗎? 你通常都能順利解決類似問題嗎?

問題二問題三

你的同學、同事在工作學習中可能不時就會提及到靜態鏈結庫動態鏈結庫靜態鏈結動態鏈結,每次聽到這些詞彙的時候在你腦海裡,a)對此有很清晰的認知;b)一頭霧水不知道他們在說些什麼,你屬於a還是b?

如果你還不能很好的解決上面前兩個問題且對於問題三屬於b,那麼接下來你就要好好看這篇文章啦,解決這幾個問題的關鍵就是這篇文章要介紹的鏈結器(linker),雖然現代的整合開發環境ide比如visual studio已經對程式設計師遮蔽了大部分鏈結器的工作,但理解鏈結器將極大提高你對工程的駕馭能力,也許你現在還不是很清楚,讀完這篇文章你就能明白啦。

讓我們引用維基百科中對鏈結器的定義:

鏈結器可操作的最小元素是乙個簡單的目標檔案,通常我們寫的.c原始檔編譯後就生成了對應的目標檔案,我們寫的實現檔案比如list.c編譯後就生成了對應的目標檔案list.o(windows下為list.obj),這個list.o就是鏈結器可以操作的最小元素。我們見到的所有應用程式,小到自己實現的hello world程式,大到複雜的比如瀏覽器,網路伺服器等,都是鏈結器將乙個個所需要用到的目標檔案匯集起來最終形成了非常複雜的應用程式(windows下是我們常見的exe檔案,linux下為elf檔案)。

我們可以把最終的應用程式想象成一座房子,構建房子的最基本的原材料就是磚,房子中各個模組像牆面,地面,屋頂等都是由一塊塊磚構築成的。而這裡的目標檔案就好比構建房子時最基本的磚。房子的各個模組就好比我們是用的靜態庫,動態庫。無論多麼複雜龐大的應用程式,對於鏈結器來說最基本的構建材料都是目標檔案。鏈結器可以將目標檔案鏈結器成為各種庫以方便使用,然後鏈結器將目標檔案以及程式依賴的各種庫再次鏈結從而形成最終的可執行檔案。

我們具體看一下鏈結器是如何工作的。

理解「屬性」這一概念

要理解好 屬性 這一概念,我覺得需要把以下幾個問題弄明白 1 例項變數與public protected private 2 例項變數的繼承性 3 屬性擺放的位置,比如宣告檔案 實現檔案 匿名分類宣告檔案等 4 屬性與例項變數的關係 5 使用屬性還是使用例項變數 6 屬性與setter getter...

iOS理解「物件等同性」這一概念

前言 最近看了一道題 nsstring s1 hello world nsstring s2 hello world 請問 s1 s2的返回值是yes還是no?相信很多童鞋的答案都是no,可能大家認為s1 s2兩個物件的位址不同,但是事實真的如此麼?為此特意寫了乙個demo來印證下 import i...

08 理解「物件等同性」這一概念

nsstring foo badger 123 nsstring bar nsstringstringwithformat badger i 123 bool eauala foo bar no bool equalb foo isequal bar yes bool equalc foo iseq...