總結gcc的具體使用,動態庫靜態庫的相關問題
《linux網路程式設計》 isbn:9787302207177 p19
gcc是linux下的編譯工具集,是gnu compiler collection的縮寫,包含gcc,g++等編譯器,還有工具集如ar,nm
gcc工具集不僅能編譯c/c++,還能編譯其他語言如objective-c
gcc還能進行交叉編譯
副檔名含義:
預設路徑:
預編譯:將標頭檔案包含進源**,並對一些巨集進行替換
編譯和優化:程式設計組合語言
彙編:彙編->機器語言,這一步生成目標檔案.o
常用選項
-c 生成目標檔案
-o 指定生成檔名稱,不指定生成預設檔名
-e 僅作預處理,不進行編譯、彙編和鏈結
-s 僅編譯到組合語言,不進行彙編和鏈結
-llibrary 進行鏈結時搜尋名為library的庫
-ldir 把dir加入到搜尋庫檔案的路徑列表中
-idir 把dir加入到搜尋標頭檔案的路徑列表中
-static 僅選用靜態程式庫進行鏈結,如果乙個目錄中靜態庫和動態庫都存在,則僅選用靜態庫
1. 將原始檔直接編譯成可執行檔案
gcc hello.c //2. 將原始檔先編譯成目標檔案,再編譯成可執行檔案生成hello.out
gcc -o hello hello.c //
指定生成的可執行檔名為hello
gcc -c hello.c //什麼是庫在windows平台和linux平台下都大量存在著庫。生成hell.o
gcc -o hello hello.o //鏈結,
生成可執行檔案hello
本質上來說庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。
由於windows和linux的平台不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二進位制是不相容的。
庫的種類
linux下的庫有兩種:靜態庫和共享庫(動態庫)。
二者的不同點在於**被載入的時刻不同。
靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大。
共享庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小。
庫存在的意義
庫是別人寫好的現有的,成熟的,可以復用的**,你可以使用但要記得遵守許可協議。
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,因此庫的存在意義非同尋常。
共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項。
注意
庫名是不包含函式庫和副檔名的字串
如果系統的搜尋路徑下存在靜態庫和動態庫,預設情況下會鏈結動態庫,如果要強制鏈結靜態庫,需要加上-static選項
無論靜態庫,還是動態庫,都是由.o檔案建立的。因此,我們必須將源程式hello.c通過gcc先編譯成.o檔案
靜態鏈結庫
先生成目標檔案,在用ar -cr生成
ar -cr libstr.a string.o //動態鏈結庫動態鏈結庫有別名(soname)、真名、鏈結名,別名:lib庫名.so,真名是在別名基礎上加上小版本號。鏈結名是程式在鏈結時使用的庫名。一般來說使用動態鏈結庫總是將庫檔案放到某個目錄下,然後用軟鏈結生成別名生成靜態庫
gcc -o test main.c libstr.a //
使用靜態庫
「pic」命令列標記告訴gcc產生的**不要包含對函式和變數具體記憶體位置的引用,這是因為現在還無法知道使用該訊息**的應用程式會將它連線到哪一段記憶體位址空間。這樣編譯出的hello.o可以被用於建立共享鏈結庫。建立共享鏈結庫只需要用gcc的」-shared」標記即可。
gcc -shared -fpic -o libmyhello.so hello.o為了讓新增加的動態鏈結庫能夠被系統共享,需要執行動態鏈結庫管理命令ldconfig。ldconfig的作用是在系統預設的搜尋路徑,和動態鏈結庫配置檔案中所列出的目錄裡搜尋動態鏈結庫,建立動態鏈結裝入程式需要的鏈結和快取檔案,搜尋完畢後將結果寫入快取檔案/etc/ld.so.cache中
環境變數
1. ld會去找gcc命令中的引數-l
2. 再找gcc的環境變數library_path
3. 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的
動態鏈結時、執行時搜尋路徑順序:
1. 編譯目標**時指定的動態庫搜尋路徑;
2. 環境變數ld_library_path指定的動態庫搜尋路徑;
3. 配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;
4. 預設的動態庫搜尋路徑/lib;
5. 預設的動態庫搜尋路徑/usr/lib。
相關知識點
nweb inf uclasses uweb.xml ulib n 從httpservlet 繼承,重寫doget dopost方法 n部署web.xml n 只有乙個物件 n 第一次請求的時候被初始化,只一遍 n 初始化後先呼叫init 方法,只一遍 n 每個請求,呼叫一遍service serv...
Linux相關知識點學習筆記
df h 檢視掛載路徑 mount dev cdrom mnt 掛載映象到 mnt路徑下 yum clean all 清除yum快取上傳tengine 2.1.0.tar.gz並解壓 root tengine 2.1.0 configure prefix opt meng nginx 生成makef...
Camera相關知識點
1 camera涉及到的概念 1.1 preview capture video preview 預覽 capture 拍照 video 錄影 1.2 幀率 快門 幀率 frame rate 用於測量顯示幀數的量度。所謂的顯示單位為每秒顯示的幀數,簡稱fps或hz 快門 shutter。快門是攝像器...