歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

關於Linux下的庫文件

先說說庫文件是怎麼來的吧。

以C為例,我們寫一個程序,一般都不會把所有的函數都寫在一個文件裡面,通常都是劃分模塊,然後一個模塊若干個文件,然後在main文件裡面調用這些模塊。我這裡用一個magic.c文件代替實際程序中的所有的文件,你就當這個magic.c文件非常神奇,你調用裡面的magic()函數後,它會自動按你的想法把剩下的工作都完成。下面是兩個文件:

mian.c

[cpp]
  1. int main(){  
  2.   magic();  
  3. }  
magic.c:

[cpp]
  1. #include <stdio.h>   
  2. void magic(){  
  3.   printf("This is a magic function\n");  
  4. }  
main.c文件裡面沒有包括任何頭文件,因為我們的編譯是手動按步驟的,實際編碼不推薦這樣做,這裡可以更加清楚的知道頭文件的作用。

一般從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]
  1. void magic();  
然後在main.c裡面包含進來:#include "magic.h"。

這兩種辦法的作用是告訴main,現在沒有magic的實現不要緊,我確定一定以及肯定這個magic函數是存在的,放心使用就好了,而且告訴了main這個magic該怎麼用,參數是什麼,返回值是什麼。

但是沒有magic的聲明也沒有問題,只是警告,不是錯誤,因為我們知道我們的magic是怎麼定義的,而且我們也確定會在後面鏈接magic函數。

但是問題就出在這裡了,比如我們寫了一個超級牛逼的函數想讓別人使用,但是這個超級牛逼的函數要下個禮拜才能給別人怎麼辦呢?我們可以先給個頭文件,然後拍著胸脯說你就按照我這個函數聲明寫,只要你的調用(call)沒問題,程序運行的結果就沒問題。

Copyright © Linux教程網 All Rights Reserved