天天看點

Linux/Unix下制作靜态連結庫和動态連結庫

他倆的具體定義我就不做此做過多叙述了,本篇文章主要講操作

先來看看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
           

繼續閱讀