C++編譯流程

C++編譯流程

  1. 在開發者端寫.h以及實作的.cpp給其他使用者使用
    1
    2
     // math.h
     int add(int a, int b);
    
    1
    2
    3
    4
    5
    6
     //math.cpp
     #include "math.h"
    
     int add(int a, int b) {
         return a + b;
     }
    
  2. 先編譯成.o的machine code
    1
    $ g++ -c math.cpp
    
  3. 封裝成「可以給別人用的東西」 分成以下幾種

    Platform Static Library Shared Library 搜尋路徑
    Windows .lib(MSVC) .dll 程式目錄 / system32
    Linux .a(MinGW)($ g++ main.cpp -lmathar rcs libmath.a math.o) .so($ g++ -shared -fPIC -o libmath.so math.o) LD_LIBRARY_PATH
    • Static Library(.a / .lib) 使用者編譯時會:
      • 把需要的機器碼 直接拷貝進他的程式
      • 產生的執行檔較大
      • 不需要額外檔案
      • 一般指令: $ g++ main.cpp -o main_static.exe -static
      • 假設使用第三方Static Library: $ g++ main.cpp -o main_static.exe -static -L/path/to/lib -lfoo(-L → Library所在路徑、-lfoo → 連結 libfoo.a)
    • Shared Library (.so / .dll)
      • 執行時才載入
      • 多個程式可共用
      • 可替換更新
      • 一般指令: $ g++ main.cpp -o main_dynamic.exe
      • 使用外部 DLL: $ g++ main.cpp -o main_dynamic.exe -L/path/to/lib -lfoo然後確保foo.dll 在可執行檔同目錄,或在 PATH 環境變數中
  4. 其他使用者如何使用我的程式
    • 我給以下兩個檔案
      1
      2
        math.h        ← 介面(一定要)
        libmath.a     ← 或 libmath.so
      
    • 使用者邊寫main.cpp
      1
      2
      3
      4
      5
      6
        // main.cpp
        #include "math.h"
      
        int main() {
            int x = add(2, 3);
        }
      
    • 使用者編譯:
      • 靜態連結: g++ main.cpp -o main_static.exe -static
      • 動態連結(預設): g++ main.cpp -lmath