C在編譯過程分爲四個階段:
1.預處理:①:頭文件展開 ②:宏替換 ③:條件編譯;
頭文件 cd /usr/include/
gcc -E demo.c> demo.i[-E(只進行預處理) >(重定向) .i(預處理文件後綴名)]
<stdio.h> 系統的頭文件目錄,找不到報錯。
“stdio.h” 現在當前目錄中找,找不到再去系統頭文件目錄中找,找不到報錯。
用戶自己定義的用“” 系統自帶的用<>。
2.編譯(進行語法檢查,詞法分析):gcc -c demo.c 在編譯階段停止 。
3.彙編 gcc -s demo.c 在彙編階段停止 demo.s 彙編文件 。
4.鏈接 單個目標無法實現運轉,必須把demo.c文件和函數庫文件鏈接在一起纔可以。
gcc hello.c -o hello or gcc -o hello hello.c 給執行文件重命名
gcc -o1 .c -o 可執行文件優化文件
-o2
-o3
gcc -w hello.c -o hello 關閉警告
gcc -Wall hello.c -o hello 開啓警告
gcc 多個.c文件 -o 執行文件 編譯多個文件
gcc main.c add.c -o add -I../ 指定頭文件第三方搜索路徑。
gcc main.c -I../ -D 外部宏定義。
/lib/ /usr/lib
庫函數:保存變量和函數,可以使用變量和函數,但是看不到函數的定義和實現。
靜態庫(.a):是在程序執行之前就加入到執行代碼中,成爲執行程序的一部分執行。
1.(執行速度快)2.(編譯速度慢)3.(佔用內存多)4.(更新麻煩)5.(部署方便)
動態庫(.so):是在執行程序啓動時加載到執行代碼中。
靜態庫
gcc -c add.c 建立庫函數add.o
ar rcs libadd.a add.o
gcc main -ladd 指定庫 默認路徑/lib/ /usr/lib。
gcc main.c -ladd -L/root/1111 指定庫路徑
動態庫
gcc -shared -fPIC -o libadd.so add.c
gcc main.c /root/1111/libadd.so -o add
c語言自帶庫:libc.a libc.so
數學庫: libm.a libm.so