makefile 與 庫的使用

2021-07-02 23:42:04 字數 1692 閱讀 4143

makefile 與 庫的使用 庫:

庫:庫就是把平時用的或者乙個專案中所用的重複的**集中放在乙個目錄下,一般是做成靜態庫或者動態庫的形式放在乙個地方,每次需要使用的時候鏈結以下就可以了。庫放置的地方和形式下面將會分開說。

靜態庫:

如果程式時在編譯時載入庫的檔案的就使用靜態庫。也就是說使用靜態庫的時候,靜態庫**在編譯時就拷貝到了程式的**段,相對的程式的體積就會膨脹。靜態庫的原則是:「以時間換空間」增加了程式的體積,同時減少了執行的時間。

靜態庫的建立:

首先,系統庫一般就在/usr/bin64/目錄下,這裡一般都是系統標準的庫。

1。首先將包含目標函式的的檔案使用-c 編譯成.o檔案

2.   使用ar -rc 命令生成  . a  檔案,ar -rc ***.a ***.o

3.   命名規則為: lib + name

4.   這時靜態庫檔案已經完成就是   lib+name.a 的這個檔案,接下來就可以使用了。

5.   然後可以使用這樣編譯   : gcc -o *** ***.c  -lname

動態庫:

在執行時載入目標**就成為了動態**,使用動態庫,則程式中只保留檔案的名字和函式名,在執行時查詢使用,這是庫的檔案是在記憶體中的,動態庫一般都在開機時載入都記憶體中,一直存在隨時鏈結使用。動態庫則是以時間換空間,增加了執行的時間,但是減少了程式本身的大小。

動態庫的使用有三種方法:

1.首先使用gcc -fpic 製作出libname.so檔案,這裡.so 檔案就是動態庫的檔案。

2.將其絕對路徑寫入/etc/ld.so.conf 中,執行ldconfig 就可以使用了,這種方法長期有效,同時你也可以將這個庫檔案寫入到/bin64 檔案中,這樣每次開機時自動載入,但是不建議這樣做,系統的標準庫一般不要隨意的修改。

3.如果你是臨時使用一次那麼就,執行/sbin/ldconfig +絕對路徑,那麼在關機之前,都是可以使用的。

最後編譯即可。

strip 可以 刪除可執行檔案的符號表,導致不可反彙編。

動態庫與靜態庫的區別:

1,靜態庫類似於乙個壓縮包,編譯器可以解開這個包。動態庫則是乙個可執行的二進位制檔案

2,靜態庫鏈結使用的時候會發生複製動作,但是動態庫只有乙份,動態庫需要使用原始碼編譯,需要放在記憶體中使用。

3,靜態庫被更改,所有都要重新鏈結,動態庫可以直接更改

4,動態庫可以跨平台,但是靜態庫不行。

makefile:

makefile 一般在編譯大型專案時使用,類似於一門語言,是一項技能。

使用它有兩種方式,1,自己定義編譯規則

2,使用它的自動推導規則的方式

最簡單的規則:

首先有乙個名字為t.c的檔案

t:t.o

這相當於使用了自動推導規則。

還有一種寫法:

tgt    =  $(shell pwd)/t

obj    =  $(shell pwd)

$(tgt):

$(cc)   -o   $(tgt)   $(obj)/*.c

clean:

rm -rf *.o

這裡就使用了,較為複雜方式,開始定義了兩個路徑,第乙個是原始檔所在的路徑,obj 是目標檔案的路徑,$(tgt),這是make的第一步,其實整個makefile都是順次執行的,除非用引數指定一般都是預設執行第一步編譯條件,然後,clean 執行的是乙個刪除命令,刪除.o 檔案。

Makefile的使用與分析5

a.c int main b.c include include b.h void fun b b.h define b 1執行make gcc c o a.o a.c gcc c o b.o b.c gcc o test a.o b.o.test結果是 this is b 2修改b.h為 defi...

makefile 使用共享庫檔案so

環境 vmware workstation centos 6.4 x86 64 說明 2 gcc在鏈結的時候要加 l引數和 l引數 l後面跟的共享庫檔案的名字 如 共享庫檔案的名字如果是libmyso.so,那麼在寫的時候,就要把前面的lib和後面的.so去掉,得到myso。4 l 告訴gcc共享庫...

makefile的使用總結

需要注意的幾點 1在乙個makefile中定義的變數不能自動傳遞到下層的makefile,即使使用export關鍵字宣告將其傳遞到子makefile中,也不能對其進行賦值操作。同時在makefile中定義的變數不能夠在target的執行命令中進行賦值,只能在全域性宣告中進行宣告,賦值操作。2在編寫m...