天天看點

C/C++ 靜态連結庫 與 動态連結庫

C/C++ 靜态連結庫 與 動态連結庫

預說明

  1. C的指令是 gcc
  2. C++的指令是 g++
  3. C++是C的超集, g++是gcc的超集
  4. 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
           
下一篇: 淺談awk

繼續閱讀