預處理
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....