1.了解静态库和动态库
动态库:程序在运行时才会去链接动态库的代码,多个程序共享使用库的代码。 后缀名一般是.so
静态库:程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候不再需要静态库。 后缀名一般是.a
简言之就是动态库在程序运行时才去库里加载需要的代码,而静态库在链接时就已经把需要的代码加载到自己的程序里。
这点也造成了二者各有优缺点
动态库
优点:节省磁盘空间。程序相对来说不会太大。
缺点:速度慢,每次都要去库里找,可移植性差。
静态库
优点:速度快,独立性强,可移植性强。
缺点:占用内存,磁盒,程序大小相对来说较大。
2.生成和使用静态库动态库
首先我们写一个测试的程序
//test.cpp
#include <iostream>
#include "add.h"
#include "sub.h"
using namespace std;
int main()
{
int a = 30;
int b = 10;
cout << "add(a,b) = " << a << " + " << b << " = " << add(a,b) << endl;
cout << "sub(a,b) = " << a << " - " << b << " = " << sub(a,b) << endl;
return 0;
}
/
//add.h
#pragma once
int add(int a,int b);
//add.cpp
#include "add.h"
int add(int a,int b)
{
return a + b;
}
///sub.h
#pragma once
int sub(int a,int b);
//sub.cpp
#include "sub.h"
int sub(int a,int b)
{
return a - b;
}
先把两个.cpp文件变成.o文件如下操作:
首先是静态库的生成
第一条命令是生成静态库。
第二条命令是查看静态库中的目录列表
接下来我们使用我们生成的静态库
我们可以看到正确的结果
-L 表示指定库路径 需要链接的静态库在当前目录下所以参数是.
-l 表示指定库名
库名不是libmymath.a吗? 这里大家需要知道lib是一个前缀代表是动态库或动态库,静态库后缀名是.a
所以真正的库名是mymath
那么如何生成动态库呢?
生成动态库之前,我要先产生位置无关码,表示与位置无关 用 fPIC
然后我们生成动态库
生成动态库用shared命令
我们总结一下生成动态库需要的两条命令
fPIC:产生位置无关码
shared:表示生成动态库
接下来使用我们生成的动态库
和静态库相同的参数
-l 表示指定库名
-L 表示指定库路径
要运行动态库我们要先做两件事
1.拷贝.so文件到共享库路径下,一般是指/user/lib
2.更改LD——LIBRARY_PATH
我们发现依然可是成功,这就是动态库的生成和使用