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:UsersAdministratorMy Documentproblem" libadd.lib

动态链接库

静态链接库,在linux下后缀为.so,windows为.dll,本质上也没啥区别

动态库,内存中只存一份备份,目标代码在运行时或者加载时链接,会因编译环境改变可能出现问题, 可移植性差

生成可重定位目标.o文件

g++ -c add.cpp

生成动态库可以一步到位

g++ -fPIC -shared libadd.dll add.cpp

在编译main的同时链接 .dll 文件

g++ -o A.exe A.cpp -L"D:UsersAdministratorMy Documentproblem" libadd.dll
原文地址:https://www.cnblogs.com/2aptx4869/p/15031894.html