参考C++静态库与动态库。
文章目录
库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种,分别是静态库和动态库。它们的区别是在编译程序的链接阶段。
静态库
后缀为.a
或.lib
,它与汇编生成的目标文件一起链接为可执行文件。一个静态库可以看做一组目标文件(.o
,.obj
)的集合。特点如下:
- 对函数库的链接放在编译时期完成。
- 程序运行时与函数库无关,移植方便。
- 占用较大的空间和资源。
实例(linux
下)
xhhmath.h
(头文件)
#pragma once
class xhhmath
{
public:
xhhmath(void);
~xhhmath(void);
static double add(double a, double b);
void print();
};
xhhmath.cpp
(源文件,库)
#include"xhhmath.h"
#include<iostream>
double xhhmath::add(double a, double b) { return a + b; }
void xhhmath::print() { std::cout << "ok!" << std::endl; }
xhhmath::~xhhmath(void) {}
xhhmath::xhhmath(void) {}
bash
下创建静态库,命名为:lib
+name+.a
icc -c xhhmath.cpp
ar -crv libxhhmath.a xhhmath.o
测试文件为test.cpp
#include<iostream>
#include"../xhhmath.h"
int main(){
xhhmath t1;
t1.print();
std::cout<<"ss"<<std::endl;
std::cin.get();
return 0;
}
编译命令为
icc test.cpp -L../ -lxhhmath -o test
-L
后接静态库所在路径,-l
接静态库的主名(按命名规则去头去尾)。
动态库
由于静态库存在的问题:空间占用较大,静态库的更新不便于部署和发布。动态库就能很好地解决这些问题。动态库的后缀为.so
或dll
,它不会被连接到目标代码中,而是在程序运行时才被载入。
特点如下:
- 把一些库函数的链接推迟到程序运行时期。
- 可以实现程序之间的资源共享。
- 一些程序的更新变得简单。
- 可以做到链接载入完全由程序员在代码中控制。
bash下创建静态库的命令为
icc -fPIC -shared -o libxhhmath.so xhhmath.cpp
然后需要把动态库复制到/usr/lib
目录下
cp libxhhmath.so /usr/lib/
编译命令和静态库一样
icc test.cpp -L../ -lxhhmath -o test