Makefile parameters
Makefile 裡面最複雜的就是很多符號以及參數不明白意思。
這邊稍微介紹一下。
跟編譯過程有關:
  • -c:編譯但不進行鏈結,會產生一個跟原始碼相同名字的 .o 檔
  • -O:表示最佳化的程度
  • -g:要包含偵錯資訊
跟連結有關:
  • -l :編譯過程需要一個 library。e.g. -lpthread 表示需要 libpthread.so 函式庫
  • -L:需要鏈結庫外部人家已經寫好的函式的目錄
  • -I : 優先搜尋的 include 檔案路徑
跟包成的目標函式庫有關:
  • -shared:如果目標為動態函式/共享函式庫,一定要加
  • -fPIC:包成動態函式
  • -static:包成靜態函式庫
其他字元:
1
%.o: %.cpp
2
g++ -Wall -g -c $^
Copied!
  • $^:所有的必要條件(%.cpp)
  • [email protected]:工作目標(%.o)
  • %:一個萬用字元,
e.g.:%.o: %.c 這一行,就會知道如果現在的工作目標是 demo.o 的話,就會去找對應的 demo.c
  • lt;:第一個必要條件(%.cpp,本例子中只有一個必要條件)
傳遞參數:
  • -Wa : 將選項 (option) 傳給組譯器
  • -wl : 將選項 (option) 傳給連結器
備註:
*編譯不連結,表示只檢查 include 裡有沒有宣告,並不會去相關 lib 找函式真的是否存在
*動態函式跟共享函式差別在於:動態函式程式執行時期並不會去檢查該函式是否存在,而是程式執行到某功能時才進行檢查。
*編譯時,利用 -L 告訴編譯器可以該路徑下尋找 libpthread.so。
若使用了-l,則必須使用的 lib 在預設尋找的目錄中,
保險起見,可以利用 -L 指定多個路徑給編譯器。
ref.
Copy link