linux g++ (二) 鏈接庫文件


首先來了解下庫文件的基礎概念。

庫文件是一些預先編譯好的操作集合(包括函數與類)。

庫文件主要有下面3種好處:

1.模塊化, 將一些功能模塊化,有利於項目的分工與管理。

2.可從用性高,庫裏面的功能不需要關心其實現,不需要關心其實現。(研究源碼及學習除外)

3.可維護性高,當項目改變時,我們對庫文件基本不需要重新編譯。

linux下面的頭文件和庫文件的默認路徑主要是下面4個:

1./usr/include及其子目錄下面的文件夾  2./usr/local/include及其子目錄下面的文件夾  3./usr/lib 4./usr/local/lib

下面簡單的說明下g++在編譯項目時如何鏈接庫函數。

先看下下面的代碼:

#include <iostream>
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{
    double x = pow(2, 3);
    cout<<"double x = "<< x <<endl;
    return 0;
}
這裏面我引用了系統的math.h庫文件.這個時候g++編譯項目中如何鏈接庫文件呢
使用下面的命令:g++ -Wall main.cpp -o main -lm 其中-l表示鏈接庫文件, m表示鏈接的時libm.so或libm.a文件.   使用的時候前面的lib可以不寫。

下面說明下.so文件與.a文件的區別.

1.a文件表示靜態庫

靜態庫在程序編譯鏈接的時候把庫的代碼鏈接到可執行文件中,在程序的運行的時候不需要靜態庫文件。

2.so文件表示是動態庫.

動態庫又稱爲共享庫。程序在使用的時候纔去鏈接共享庫的代碼。多個程序可共享動態庫的代碼。在程序運行的時候 需要動態庫(不然程序會出現問題)。

一個動態庫鏈接的可執行文件僅僅只是包含它用到的函數入口的一個表,而不是外部函數的目標文件的整個代碼。在運行之前,調用的函數代碼由操作系統從磁盤上的動態庫中複製帶內存中,這個過程就叫動態鏈接。

動態庫可以在多個程序間共享,所以動態庫使用的執行文件更小,而操作系統採用了虛擬內存機制允許內存中的一份動態庫被該進程使用,節省了內存空間。


如何生成庫文件呢?

例如我們用一個fun.h和fun.cpp文件

1.我們需要生成一個.o文件

g++ -Wall -c fun.cpp -o fun.o

2.利用ar rcs命令才生成一個.a文件

ar rcs libfun.a fun.o

利用g++ 編譯鏈接程序

g++ -Wall main.cpp libfun.a -o main即可

還有另一種方式來鏈接g++ -Wall main.cpp -o main -lfun。但是這樣就有一個問題,提示我們無法找到庫文件,這是由於這種鏈接方式會去系統默認的文件夾裏面去找庫文件。

這樣就需要添加選項,g++ -Wall -L. main.cpp -o main -lfun。-L. 表示編譯的庫文件在當前文件夾裏面。

下面介紹如何生成動態庫文件。

1.我們需要生成一個.o文件

g++ -Wall -c fun.cpp -o fun.o

2.g++ -shared -fPIC fun.o -o libfun.so即可.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章