1.源碼到而二進制主要三階段:
預處理->編譯->鏈接
2.實際例子:
目錄結構如下圖所示
│ makefile
│
├─bin
│ main.exe
│
├─include
│ libtmp.h
│
├─lib
│ libtmp.dll
│
└─src
main.c
temp.c
temp.h
.dll文件爲windows下的動態鏈接庫
僅預處理:gcc -E
僅轉爲彙編源碼:gcc -S
僅編譯:gcc -c
默認三步全做:gcc
預處理只分別處理每個文件
編譯期間僅考慮聲明的完整性
若編譯爲動態鏈接庫,那就還要求聲明對應定義的完整性
若編譯爲可執行文件,那就還要求有main
若編譯爲靜態鏈接庫,那就仍然只考慮聲明
工作目錄爲makefile所在目錄
main.c想要加入temp.h那麼
#include"./temp.h"
使用相對路徑
如果想要
#include<libtmp.h>
編譯使用
gcc -I./include 或者 gcc -Iinclude
上面“-”後面是大寫的i
大寫的I,大寫L,小寫l,大寫D,後面都緊隨一個用於此選項的參數,並且可以和這個參數之間不空格
用-I加入的是一個目錄,臨時添加頭文件查找目錄,優先級高於系統默認目錄
gcc -c 這個階段,鏈接還可以-L也可以類似的添加一個目錄,爲鏈接庫搜索目錄,優先級同樣高於系統目錄(靜態或者動態都算)
windows下動態庫libxxx.dll
unix下動態庫libxxx.so
windows/unix下靜態庫libxxx.a
windows下gcc -shared可以生成動態庫,比如:
gcc -shared -fPIC libxxx.dll tmp1.o tmp2.o tmp3.o
unix下ar 可以生成動態庫,比如:
ar -cqs libxxx.a tmp1.o tmp2.o tmp3.o
ar命令行參數依次爲:
選項 目標文件 源文件
使用的時候可以省略ib兩個字母,比如:
學習unp的時候,用到的編譯選項:
gcc xxx.c -o xxx -lunp
-lunp -lpthread
其實是-linunp -libpthread
後綴名.dll .so .a都需要省略
ps:libunp是我們下載源碼後,按照使用流程編譯的,libpthread是Unix自帶的
選項-lunp -lpthread均不跟路徑(已經添加到默認路徑了)
選項-L+路徑,手動臨時添加路徑,如目錄:
-Llib添加lib目錄
如果想使用libtmp.dll,就需要編譯的時候:
gcc -c src/main.c -o main.o -Iinlcude
gcc main.o -o bin/main.exe -Llib -ltmp 添加lib爲動態鏈接庫目錄,使用libtmp.dll