前言:
在前文中,我們從磁盤的理解,逐步構(gòu)建了文件系統(tǒng)框架,并探討了軟硬鏈接,逐漸理解了為什么運行程序需要使用./a.out,以及前面的點號的含義。
在文件權(quán)限部分,我們接觸了最基本的庫,了解到linux系統(tǒng)中動態(tài)庫的后綴是.so,靜態(tài)庫是.a,而windows系統(tǒng)中動態(tài)庫是.dll,靜態(tài)庫是.lib。我們也知道庫的名字需要去掉前綴和后綴,這是我們對庫的初步認(rèn)識。
那么,我們是否已經(jīng)使用過庫呢?
當(dāng)然是使用過的。在使用c語言和c++時,我們用到的頭文件就位于庫中,比如標(biāo)準(zhǔn)庫(std庫),我們肯定是用過的。那么,庫的作用是什么呢?
在STL容器中,都有基本函數(shù)的接口,比如vector的push_back,我們使用的是這些接口,那么具體的實現(xiàn)又在哪里呢?
具體的實現(xiàn)肯定是放在.cc文件中,通過編譯器編譯成.o文件,然后這些文件被合并,形成了最終的庫。
現(xiàn)在,我們就從“是什么”、“為什么”和“怎么辦”三個方面來討論靜態(tài)庫和動態(tài)庫。
靜態(tài)庫為了生成靜態(tài)庫,我們首先模擬實現(xiàn)多個.c文件和多個.h文件:
然后在這些文件中寫入對應(yīng)的代碼:
#pragma once int Sub(int x, int y); <h1>include "sub.h"</h1><p>int Sub(int x, int y) { return x - y; }</p><h1>include "add.h"</h1><p>int Add(int x, int y) { return x + y; }</p><h1>pragma once</h1><p>int Add(int x, int y);
我們創(chuàng)建了兩個.c文件和兩個.h文件。
然后我們在test.c文件中進(jìn)行測試:
#include <stdio.h></p><h1>include "add.h"</h1><h1>include "sub.h"</h1><p>int main() { printf("a + b = %dn", Add(10,20)); printf("a - b = %dn", Sub(10,20)); return 0; }
如果我們直接編譯,肯定是無法通過的,因為真正的實現(xiàn)是在.c文件中:
那么我們不妨先生成.o文件,為靜態(tài)庫做準(zhǔn)備:
然后使用ar命令生成靜態(tài)庫:
其中,replace是r,c是create,如果庫不存在則創(chuàng)建。
這是靜態(tài)庫的創(chuàng)建過程,libmyc.a就是我們創(chuàng)建的靜態(tài)庫,但實際上,myc才是這個靜態(tài)庫的名稱。
然而,對于庫的使用來說,比如C語言提供多個庫,我們都是通過#include
使用-L和-l選項可以解決這個問題。
動態(tài)庫的部分將在后續(xù)文章中介紹。
這里還涉及一些附加問題,將在后續(xù)更新中詳細(xì)討論。
感謝閱讀!