他倆的具體定義我就不做此做過多叙述了,本篇文章主要講操作
先來看看C/C++源代碼運作的過程(Linux/Unix)
// 運作C程式
gcc -c main.c
// 運作cpp程式
g++ -c main.cpp
分成四個階段:preprocess(預處理),compilation(編譯),assembly(組裝),linking(連結)
- 預處理:宏變量,條件編譯,頭檔案,生成.i
- 編譯:生成.s
- 組裝:二進制生成.o
- 連結:ld上連結庫生成a.out檔案
靜态連結庫
即對于頭檔案中的函數聲明進行檔案外寫出
但是,無論你願不願意,lib中的指令都被直接包含在最終生成的EXE檔案中了(加大了存儲消耗)
字尾名分類:
- Windows:.lib
- Linux/Unix:.a
首先建立頭檔案
// head.h
#ifndef __HEAD_H__
#define __HEAD_H__
int add(int a, int b);
#endif
然後建立靜态連結庫
首先建立cpp檔案
// libadd.cpp
#include "head.h"
int add(int a, int b) {
return a+ b;
}
編譯生成靜态連結庫
g++ -c libadd.cpp -I head/ // 生成libadd.o
ar rcs libadd.a libadd.o // 生成libarr.a檔案
建立主函數檔案
// main.cpp
#include <iostream>
#include "head.h"
int main(void) {
int ret = add(2, 5);
std::cout << ret << std::endl;
}
将主函數檔案同靜态連結庫連接配接起來
g++ main.cpp -o main -I head/ -L lib/ -ladd
動态連結庫
該DLL不必被包含在最終EXE檔案中,EXE檔案執行時可以“動态”地引用和解除安裝這個與EXE獨立的DLL檔案
- Windows:.dll
- Linux/Unix:.so
生成不同
生成連結庫
g++ -fPIC -c libadd.cpp -I head/ // 生成.o
g++ -shared -o libadd.so libadd.o // 生成.so