gcc學習筆記

2021-07-22 04:55:51 字數 2527 閱讀 1536

預處理

gcc -e hello.c -o hello.i //輸出預處理後的檔案

編譯 gcc -s hello.i -o hello.s //輸出彙編結果

彙編 gcc -c hello.s -o hello.o //輸出二進位制檔案

鏈結 gcc hello.s -o hello //輸出鏈結後的二進位制,沒有選項

-wall 警告

-idir 加入標頭檔案搜尋路徑

-ldir 加入索索庫的目錄

-llib 鏈結lib庫

-g 在目標檔案中加入除錯資訊,如果沒有加蓋選擇是木能除錯的

選項先後順序可以調換

每次都盡量要加 -wall選項

hello_fn.h

hello_fn.c

main.c

gcc -wall hellow_fn.c main.c -o main

gcc -wall -c hello_fn.c -o hello

gcc -wall hello.o main.o -o main

單獨編譯的,如果更改其中乙隻更改了,只需要編譯其中修改,重新鏈結一下

靜態庫( .a檔案),在鏈結階段把二進位制檔案鏈結到可執行檔案中。執行時不再需要靜態庫

動態庫(共享庫 .so .sa檔案) 程式在執行的時候才會去鏈結動態庫,多個程式共享動態庫**(節省了動態庫的指令記憶體區)。

//-l 是在指定路徑下搜尋該庫目錄。

//-i 存放標頭檔案的位置

-l -i 從左到右搜

c_include_path library_path 環境變數的值對應位置

配置環境變數

vi ~/bash_profile

export library_path = /home/hzz/code:/home/xiaoming/work

export cpp_include =/home/hzz/code/cppinclude

export c_include=/home/hzz/code/cinclude

//注意與windows的不同,用: 分割

3.系統預設路徑

/usr/include

/usr/local/include

/usr/lib

/usr/local/lib

(注意這裡的 usr 為unix system resource 的意思)

修改完執行一遍該配置檔案。

找共享庫

//找共享庫的位置修改方式

1.配置環境變數

vi ~/bash_profile

export ld_library_path =/home/hzz/code/lib

2.配置 /etc/ld/ld.so.conf

然後用ldconfig 命令更新該檔案

ldd main 可以看可執行程式包含哪些些庫

現有檔案如下:

hello_fn.h

hello_fn.c

生成靜態庫

mian.c

gcc -c hello.c //輸出hello.o檔案

gcc -c main.c //輸出main.o

可將多個.o檔案,打包成.a檔案

ar rcs libhello.a hello_fn.o //打包成.a 靜態庫

gcc -wall main.o libhello.a -o main //鏈結進main二進位制檔案

另外一種使用庫的方式(這種可能更常用)

gcc -wall -l . main.o -o main -lhello

動態庫庫名規則lib***.so

(fpic 全拼為 position independent code)

gcc -shared -fpic hello.o -o libhello.so

//使用

gcc -wall -l . main.o -o main -lhello

假設當前目錄下有兩個同名的hllo.a hello.so 庫

gcc -l . main.o -o main -lhello //優先使用動態庫

gcc -l . main.o -o main -static -lhello

當對動態庫與靜態庫混合連線的時候,使用-static會導致所有的庫都使用靜態連線的方式。這時需要作用-wl的方式:

gcc test.cpp -l. -wl,-bstatic -ltestlib -wl,-bdynamic -ltestdll

另外還要注意系統的執行庫使用動態連線的方式,所以當動態庫在靜態庫前面連線時,必須在命令列最後使用動態連線的命令才能正常連線 如:

gcc test.cpp -l. -wl,-bdynamic -ltestdll -wl,-bstatic -ltestlib -wl,-bdynamic

最後的-wl,-bdynamic表示將預設庫鏈結模式恢復成動態鏈結。

檢視庫的匯出函式

nm *.so

readelf -a so

暫時了解有用了在細查引數吧。

gcc學習筆記

1 連線標頭檔案 gcc i usr openwim include fred.c 使用 i 標誌來包含儲存在子目錄或者非標準位置的中的標頭檔案。例如上邊語句指示編譯器不僅在標準位置,也在 usr openwim include 目錄中查詢程式 fred.c包含的標頭檔案。2 連線庫檔案 a 靜態庫...

gcc 學習筆記

gcc 編譯程式的過程 預處理 pre processing 編譯 compiling 彙編 assembling 鏈結 linking 選項名 作用 o 產生目標 i s o 可執行檔案等 c 通知gcc取消鏈結步驟,即編譯原始碼並在最後生成目標檔案 e 只執行c預編譯器 s 告訴編譯器產生組合語...

Gcc學習筆記

1.編譯c檔案生成可執行檔案 後續例子如無特殊說明均為c檔案 gcc helloworld.c 2.編譯c 檔案生成可執行檔案 用g g helloworld.cpp gcc wall g hello.c 4.指定編譯後檔案的檔名 o,不寫 o預設命名為a.out gcc wall g hello....