動態庫與靜態庫
這篇文章參考於教程: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