Linux 使用gcc生成靜態庫和動態庫

2021-07-27 04:11:23 字數 1635 閱讀 1632

首先,庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。在linux下分為兩種,靜態庫和共享庫(動態庫)。對比兩者的區別如下:

庫的種類

描述優點

缺點靜態庫

目標檔案的簡單集合,linux下以.a作為字尾,程式編譯時載入

程式所需庫被載入後不會發生跨平台不相容等類似的問題

由於所需的**被載入到程式中,故體積大,佔記憶體

動態庫程式執行時載入,linux下以.so作為字尾

體積小,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項

依賴於庫,跨平台可能會存在不相容的問題

2.1 gcc生成靜態庫

我們現在分別有hello.h,hello.c,test.c三個檔案。關係:test.c呼叫hello()函式,它定義在hello.c內,宣告在hello.h內。

第一步:使用gcc -c hello.c 生成hello.o檔案。

第二步:使用ar crv libhello.a hello.o 由hello.o生成靜態庫檔案libhello.a。靜態庫檔案的命名規範:lib+檔名.a。所以我們生成的靜態庫檔案也必須遵循這個規範。

第三步:使用gcc -o test test.c libhello.a 生成可執行檔案test。最後乙個引數 libhello.a指明了生成目標程式要用到的靜態庫名。gcc將會從靜態庫中將公用函式連線到目標檔案中。

最後,我們驗證一下靜態庫的特點,刪除靜態庫libhello.a,再次執行可執行程式test。

刪除靜態庫後程式依然正常執行,說明靜態庫在程式編譯時被載入到程式後成為程式的一部分,就算刪除了庫,對程式也沒有影響。

2.2 gcc生成動態庫

第一步:依賴hello.c生成hello.o。與靜態庫生成第一步相同。

第二步:通過gcc -shared -fpci -o libhello.so hello.o命令生成動態庫檔案。動態庫檔案命名方式是lib+檔名.so。

第三步:gcc -o test test.c libhello.so 生成可執行檔案test。但是會發現生成的可執行檔案test執行出錯,如下:

出現這樣的原因是,程式在執行時,會在/usr/lib和/lib等目錄中查詢需要的動態庫檔案。若找到,則載入動態庫,否則將提示錯誤資訊而終止程式。所以,我們需要將生成的動態庫移動到/usr/lib目錄下程式即可正常執行。

Linux 用gcc生成靜態庫和動態庫

linux下的庫有兩種 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同。靜態庫在程式編譯時會被連線到目標 中,目標程式執行時將不再需要該動態庫,移植方便,體積較大,但是浪費空間和資源,因為所有相關的物件檔案與牽涉到的庫被鏈結合成乙個可執行檔案。動態庫在程式編譯時並不會被連線到目標 中,而...

如何使用GCC生成動態庫和靜態庫

根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...

如何使用GCC生成動態庫和靜態庫

根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...