gcc
編譯程式的過程
預處理(pre-processing)
編譯(compiling)
彙編(assembling)
鏈結(linking)
選項名
作用
-o
產生目標(.i、.s、.o、可執行檔案等)
-c
通知gcc取消鏈結步驟,即編譯原始碼並在最後生成目標檔案
-e
只執行c預編譯器
-s
告訴編譯器產生組合語言檔案後停止編譯,產生的組合語言擴充套件名為.s
-wall
使gcc對原始檔的**有問題的地方發出警告
-idir
將dir目錄加入搜尋標頭檔案的目錄路徑
-ldir
將dir目錄加入搜尋庫的目錄路徑
-llib
鏈結lib庫
-g
在目標檔案中嵌入除錯資訊,以便gdb之類的除錯程式除錯
靜態庫與共享庫
在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該共享庫中複製到記憶體中,這個過程稱為動態鏈結(dynamic linking)
共享庫可以在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。作業系統採用虛擬記憶體機制允許物理記憶體中的乙份共享庫被要用到該庫的所有程序共用,節省了記憶體和磁碟空間。
生成靜態庫
hello_fn.h
hello_fn.c
main.c
gcc -wall hello_fn.c -o hello_fn.o
ar rcs libhello.a hello_fn.o
ar是gnu歸檔工具,rcs表示(replace and create)
gcc -wall main.c libhello.a -o main
gcc -wall -l. main.c -o main -lhello
庫搜尋路徑
c_include_path、library_path
從左到右搜尋-i -l指定的目錄。
由環境變數指定的目錄
由系統指定的目錄
生成共享庫
shared: 表示生成共享庫格式
fpic:產生位置無關碼(position independent code)
庫名規則:lib***.so
示例:gcc -shared -fpic hello.o –o libhello.so
使用共享庫
編譯選項
l:鏈結共享庫,只要庫名即可(去掉lib以及版本號)
l:鏈結庫所在的路徑.
示例:gcc main.o -o main –l. -lhello
執行共享庫
q1、拷貝.so檔案到系統共享庫路徑下
一般指/usr/lib
q2、更改ld_library_path
q3、ldconfig
配置ld.so.conf,ldconfig更新ld.so.cache
gcc學習筆記
1 連線標頭檔案 gcc i usr openwim include fred.c 使用 i 標誌來包含儲存在子目錄或者非標準位置的中的標頭檔案。例如上邊語句指示編譯器不僅在標準位置,也在 usr openwim include 目錄中查詢程式 fred.c包含的標頭檔案。2 連線庫檔案 a 靜態庫...
gcc學習筆記
預處理 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 輸出鏈結後的二進位制,沒有選項 wal...
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....