Linux 动态库与静态库详解

动态库与静态库

这篇文章参考于教程:http://c.biancheng.net/view/2385.html
我将其精炼总结后写出以下文章。

前言

为什么要使用动态库与静态库
因为在某些情况下,我们可能并不想公开源码,那么我们就将写好的函数编译成二进制文件,再放入到系统库中,这样一来,别人就只能调用我们写好的函数而无法窥视我们的源码。

动态库于静态库的区别

动态库 静态库
加载 程序运行时加载,不写入程序中,程序会较小 在链接.o文件时加载,写入程序中,程序会较大
依赖 依赖于系统变量,如果系统变量中没有,则无法运行 不依赖系统变量,因为是直接写入程序中的

一.动态库

使用动态库链接multi乘法,首先来看main.cpplibmulti.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.cpplibadd.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章