C++編譯流程
- 在開發者端寫
.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; } - 先編譯成
.o的machine code1
$ g++ -c math.cpp -
封裝成「可以給別人用的東西」 分成以下幾種
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 環境變數中
- Static Library(
- 其他使用者如何使用我的程式
- 我給以下兩個檔案
1
2math.h ← 介面(一定要) libmath.a ← 或 libmath.so - 使用者邊寫
main.cpp1
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
- 靜態連結:
- 我給以下兩個檔案