C/C++ 静态链接库 与 动态链接库
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,本质上也没啥区别
动态库,内存中只存一份备份,目标代码在运行时或者加载时链接,会因编译环境改变可能出现问题, 可移植性差
生成可重定位目标.o文件
g++ -c add.cpp
生成动态库可以一步到位
g++ -fPIC -shared libadd.dll add.cpp
在编译main的同时链接 .dll 文件
g++ -o A.exe A.cpp -L"D:\Users\Administrator\My Document\problem" libadd.dll