Linux下GCC相關知識點

2022-05-02 16:39:13 字數 2840 閱讀 2370

總結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    //

生成hello.out

gcc -o hello hello.c //

指定生成的可執行檔名為hello

2. 將原始檔先編譯成目標檔案,再編譯成可執行檔案

gcc -c hello.c    //

生成hell.o

gcc -o hello hello.o //鏈結,

生成可執行檔案hello

什麼是庫在windows平台和linux平台下都大量存在著庫。

本質上來說庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。

由於windows和linux的平台不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二進位制是不相容的。

庫的種類

linux下的庫有兩種:靜態庫和共享庫(動態庫)。

二者的不同點在於**被載入的時刻不同。

靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大。

共享庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小。

庫存在的意義

庫是別人寫好的現有的,成熟的,可以復用的**,你可以使用但要記得遵守許可協議。

現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的**都從零開始,因此庫的存在意義非同尋常。

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

注意

庫名是不包含函式庫和副檔名的字串

如果系統的搜尋路徑下存在靜態庫和動態庫,預設情況下會鏈結動態庫,如果要強制鏈結靜態庫,需要加上-static選項

無論靜態庫,還是動態庫,都是由.o檔案建立的。因此,我們必須將源程式hello.c通過gcc先編譯成.o檔案

靜態鏈結庫

先生成目標檔案,在用ar -cr生成

ar -cr libstr.a string.o          //

生成靜態庫

gcc -o test main.c libstr.a //

使用靜態庫

動態鏈結庫動態鏈結庫有別名(soname)、真名、鏈結名,別名:lib庫名.so,真名是在別名基礎上加上小版本號。鏈結名是程式在鏈結時使用的庫名。一般來說使用動態鏈結庫總是將庫檔案放到某個目錄下,然後用軟鏈結生成別名

「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。快門是攝像器...