什么是鏈接?對于初學C語言的朋友,可能對 我們的C代碼編譯生成可執(zhí)行程序會經(jīng)過如下過程: 鏈接就是把目標文件與一些庫文件生成可執(zhí)行文件的一個過程。關于更詳細的編譯過程,可查閱往期筆記:【本質】你知道C語言編譯的過程嗎? 靜態(tài)、動態(tài)鏈接?1、什么是靜態(tài)鏈接? 靜態(tài)鏈接是由鏈接器在鏈接時將庫的內(nèi)容加入到可執(zhí)行程序中的做法。 鏈接器是一個獨立程序,將一個或多個庫或目標文件(先前由編譯器或匯編器生成)鏈接到一塊生成可執(zhí)行程序。 這里的庫指的是靜態(tài)鏈接庫,Windows下以.lib為后綴,Linux下以.a為后綴。 2、什么是動態(tài)鏈接? 動態(tài)鏈接( 這里的庫指的是動態(tài)鏈接庫,Windows下以.dll為后綴,Linux下以.so為后綴。 值得一提的是,在Windows下的動態(tài)鏈接也可以用到.lib為后綴的文件,但這里的.lib文件叫做導入庫,是由.dll文件生成的。 3、靜態(tài)鏈接與動態(tài)鏈接的優(yōu)缺點? (1)靜態(tài)鏈接的優(yōu)缺點: 優(yōu)點:
缺點:
(2)動態(tài)鏈接的優(yōu)缺點: 優(yōu)點:
缺點:
靜態(tài)、動態(tài)鏈接實驗下面的實驗基于Windows平臺。Windows下的靜態(tài)鏈接、動態(tài)鏈接實驗網(wǎng)上較多的是使用一些IDE如 本篇筆記我們不使用IDE,而是以Windows平臺搭配 我們先編寫如下代碼(共三個文件): 文件1(main.c): #include "test.h" 文件2(test.c): #include "test.h" 文件3(test.h): #ifndef __TEST_H 此時我們的代碼目錄如下: 1、靜態(tài)鏈接實驗 進入我們的代碼路徑,輸入命令: gcc -c test.c main.c 編譯、匯編指定的源文件(也就是編譯源文件),將每一個源文件編譯成對應的目標文件。此時文件夾下多出了 接下來使用 ar rv lib_test.lib test.o main.o 其實,用MinGW可以生成.a后綴和.lib后綴的靜態(tài)鏈接庫,這里生成的是.lib后綴的靜態(tài)庫。此時文件夾下多出了.lib文件: 然后把這個靜態(tài)庫鏈接成可執(zhí)行文件
此時文件夾下多出了可執(zhí)行文件 雙擊運行: 可見,運行結果與預期一致,說明我們使用靜態(tài)鏈接的方式生成的可執(zhí)行文件沒問題。 這個可執(zhí)行文件的運行并不依賴于 2、動態(tài)鏈接實驗 我們把 gcc test.c -shared -o dll_test.dll 此時文件夾下多出了動態(tài)庫文件 我們用該動態(tài)庫文件 gcc dll_test.dll main.c -o dll_test.exe 此時文件夾下多出了可執(zhí)行文件 雙擊運行: 可見,運行結果與預期一致,說明我們使用動態(tài)鏈接的方式生成的可執(zhí)行文件沒問題。 這個可執(zhí)行文件的運行依賴于 那是因為使用動態(tài)鏈接庫的應用程序不是自完備的,它依賴的DLL模塊也要存在。 動態(tài)鏈接的方式使用得很廣泛,比如我們電腦系統(tǒng)盤的 騰訊QQ安裝目錄下: 上面使用的命令其實與Linux下操作的命令大多都很相似,我們只要明白這么一回事就可以很快地在Linux下進行操作。 |
|