先說說庫文件是怎麼來的吧。
以C為例,我們寫一個程序,一般都不會把所有的函數都寫在一個文件裡面,通常都是劃分模塊,然後一個模塊若干個文件,然後在main文件裡面調用這些模塊。我這裡用一個magic.c文件代替實際程序中的所有的文件,你就當這個magic.c文件非常神奇,你調用裡面的magic()函數後,它會自動按你的想法把剩下的工作都完成。下面是兩個文件:
mian.c
[cpp]一般從C源文件到可執行代碼要經過以下4個步驟:預編譯(preprocess gcc -E,生成.i文件),編譯(compile gcc -S,生成.s文件),匯編(assemble gcc -c,生成.o文件),鏈接(link 生成可執行文件)。這裡只討論最後兩個步驟,匯編和鏈接。
匯編後的結果是每個源文件都有了對應的二進制代碼;鏈接是把所有的二進制代碼打包成一個文件,最後得到可執行文件。
使用這個命令匯編main.c:gcc -Wall -c main.c
-Wall 是列出警告的開關,如果沒有這個開關,匯編成功,什麼提示都沒有,如果打開這個開關,會得到如下一個警告:
main.c:2:3: warning: implicit declaration of function ‘magic’ [-Wimplicit-function-declaration]
要消除這個警告很容易,有兩個辦法:
1)前面加個聲明就好了,void magic();
2)寫個magic.h的頭文件:
[cpp]這兩種辦法的作用是告訴main,現在沒有magic的實現不要緊,我確定一定以及肯定這個magic函數是存在的,放心使用就好了,而且告訴了main這個magic該怎麼用,參數是什麼,返回值是什麼。
但是沒有magic的聲明也沒有問題,只是警告,不是錯誤,因為我們知道我們的magic是怎麼定義的,而且我們也確定會在後面鏈接magic函數。
但是問題就出在這裡了,比如我們寫了一個超級牛逼的函數想讓別人使用,但是這個超級牛逼的函數要下個禮拜才能給別人怎麼辦呢?我們可以先給個頭文件,然後拍著胸脯說你就按照我這個函數聲明寫,只要你的調用(call)沒問題,程序運行的結果就沒問題。