动态库与静态库
这篇文章参考于教程:http://c.biancheng.net/view/2385.html
我将其精炼总结后写出以下文章。
前言
为什么要使用动态库与静态库
?
因为在某些情况下,我们可能并不想公开源码,那么我们就将写好的函数编译成二进制文件,再放入到系统库中,这样一来,别人就只能调用我们写好的函数而无法窥视我们的源码。
动态库于静态库的区别
:
动态库 | 静态库 | |
---|---|---|
加载 | 程序运行时加载,不写入程序中,程序会较小 | 在链接.o文件时加载,写入程序中,程序会较大 |
依赖 | 依赖于系统变量,如果系统变量中没有,则无法运行 | 不依赖系统变量,因为是直接写入程序中的 |
一.动态库
使用动态库链接multi乘法,首先来看main.cpp
与 libmulti.cpp
。
main.cpp
:
#include <iostream>
using namespace std;
int multi(int,int);
int main()
{
cout << multi(3, 4) << endl;
return 0;
}
libmulti.cpp
:
int multi(int x,int y)
{
return x * y;
}
流程:
1.g++ -fPIC -shared libmulti.cpp -o libmulti.so
首先编译源文件为动态库
2.g++ main.cpp -o main -L . -l multi
然后编译主函数的过程中需要用到multi函数,则需要进行链接
3.sudo cp libmulti.so /usr/lib
将已经生成的动态库放到/usr/lib中,这样主函数会自动链接此处的multi函数,同时,也可以保证源码的安全性,别人无法得知真正的multi函数的全貌,只能够通过通过动态函数库来调用。
4../main
执行程序,自动加载动态库(注意此时动态库函数必须存放在 /usr/lib 中)。
结果输出:
wwx@VM-0-7-ubuntu:~/Linux/Day03/dynamic$ ./main
12
二.静态库
使用静态库实验add加法。
先来看main.cpp
与 libadd.cpp
:
wwx@VM-0-7-ubuntu:~/Linux/Day03/static$ cat main.cpp
#include <iostream>
using namespace std;
int add(int,int);
int main()
{
cout << add(3, 4) << endl;
return 0;
}
wwx@VM-0-7-ubuntu:~/Linux/Day03/static$ cat libadd.cpp
int add(int x, int y )
{
return x + y;
}
流程:
1.g++ -c libadd.cpp -o libadd.o
首先将功能函数编译(不链接)成二进制文件
2.ar rcs libadd.a libadd.o
然后将二进制文件压缩成静态库
3.g++ main.cpp -o main -L . -ladd
再编译主函数,并且再链接的过程中加入add函数
4../main
执行文件
我们平时常用的Posix 线程函数就是使用的静态库,所以我们每次编译的过程都需要使用 -lpthread 就是这个原因
输出:
wwx@VM-0-7-ubuntu:~/Linux/Day03/static$ ./main
7