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...