轉—gcc指定庫路徑,頭文件路徑以及實現靜態動態連接

http://wendell07.blog.hexun.com/27431559_d.htmlhtml

 在Linux 下開發軟件時,徹底不使用第三方函數庫的狀況是比較少見的,一般來說都須要藉助一個或多個函數庫的支持纔可以完成相應的功能。從程序員的角度看,函數庫實 際上就是一些頭文件(.h)和庫文件(.so或者.a)的集合。雖然Linux下的大多數函數都默認將頭文件放到/usr/include/目錄下,而庫 文件則放到/usr/lib/目錄下,但並非全部的狀況都是這樣。正因如此,GCC在編譯時必須有本身的辦法來查找所須要的頭文件和庫文件。程序員

GCC採用搜索目錄的辦法來查找所須要的文件,-I選項能夠向GCC的頭文件搜索路徑中添加新的目錄。例如,若是在/home/xiaowp/include/目錄下有編譯時所須要的頭文件,爲了讓GCC可以順利地找到它們,就可使用-I選項:函數

 

# gcc foo.c -I /home/xiaowp/include -o foo

一樣,若是使用了不在標準位置的庫文件,那麼能夠經過-L選項向GCC的庫文件搜索路徑中添加新的目錄。例如,若是在/home/xiaowp/lib/目錄下有連接時所須要的庫文件libfoo.so,爲了讓GCC可以順利地找到它,可使用下面的命令:spa

 

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

值得好好解釋一下的是-l選項,它指示GCC去鏈接庫文件libfoo.so。Linux下 的庫文件在命名時有一個約定,那就是應該以lib三個字母開頭,因爲全部的庫文件都遵循了一樣的規範,所以在用-l選項指定連接的庫文件名時能夠省去 lib三個字母,也就是說GCC在對-lfoo進行處理時,會自動去連接名爲libfoo.so的文件。htm

Linux下的庫文件分爲兩大類分別是動態連接庫(一般以.so結尾)和靜態鏈 接庫(一般以.a結尾),二者的差異僅在程序執行時所需的代碼是在運行時動態加載的,仍是在編譯時靜態加載的。默認狀況下,GCC在連接時優先使用動態鏈 接庫,只有當動態連接庫不存在時才考慮使用靜態連接庫,若是須要的話能夠在編譯時加上-static選項,強制使用靜態連接庫。例如,若是在 /home/xiaowp/lib/目錄下有連接時所須要的庫文件libfoo.so和libfoo.a,爲了讓 GCC在連接時只用到靜態連接庫,可使用下面的命令:blog

 

# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo