C/C++ 靜态連結庫 與 動态連結庫
預說明
- C的指令是 gcc
- C++的指令是 g++
- C++是C的超集, g++是gcc的超集
- g++能編譯C,gcc不能編譯C++
就是因為4,卡了半天
用g++生成的庫,是沒辦法用gcc連結的,反之成立
用到的檔案
(都在同一目錄下)
//add.h
#ifndef H_ADD_H
#define H_ADD_H
int add(int a, int b);
#endif //H_ADD_H
//add.cpp
#include "add.h"
int add(int a, int b) {
return a + b;
}
//main.cpp
#include <stdio.h>
#include "add.h"
int main() {
int a, b;
scanf("%d%d", &a, &b);
printf("%d", add(a, b));
system("pause");
return 0;
}
靜态連結庫
靜态連結庫,在linux下字尾為.a,windows為.lib,本質上沒啥差別
靜态庫在最終連結的時候,相當于替換,記憶體中存在多分副本,浪費記憶體
好處是編譯完之後,就和編譯環境沒關系了,可移植性強
想要生成靜态庫,首先
生成可重定位目标.o檔案
g++ -c add.cpp
打包生成靜态庫
# ar -crv libxxx.lib(xxx是生成的庫的名字) xxx.o
ar -crv libadd.lib add.o
在編譯main的同時連結 .lib 檔案
#g++ -o xx.exe xx.cpp -L庫所在的位址 庫名
g++ -o main.exe main.cpp -L"D:\Users\Administrator\My Document\problem" libadd.lib
動态連結庫
靜态連結庫,在linux下字尾為.so,windows為.dll,本質上也沒啥差別
動态庫,記憶體中隻存一份備份,目标代碼在運作時或者加載時連結,會因編譯環境改變可能出現問題, 可移植性差
g++ -c add.cpp
g++ -fPIC -shared libadd.dll add.cpp
g++ -o A.exe A.cpp -L"D:\Users\Administrator\My Document\problem" libadd.dll