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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章