gcc学习(二)[第二版]
頭文件與庫文件
1、概要
在使用C語言和其他語言進行程序設計的時候,我們需要頭文件來提供對常數(shù)的定義和對系統(tǒng)及庫函數(shù)調用的聲明。
庫文件是一些預先編譯好的函數(shù)集合,那些函數(shù)都是按照可重用原則編寫的。它們通常由一組互相關聯(lián)的用來完成某項常見工作的函數(shù)構成。比如用來處理屏幕顯示情況的函數(shù)(ncurses庫)和數(shù)據(jù)庫訪問例程(dbm庫)等。
?
2、使用庫的優(yōu)點:
1)模塊化開發(fā)
2)可重用性
3)可維護性
?
3、頭文件與庫文件的位置
/usr/include及其子目錄底下的include文件夾
/usr/local/include及其子目錄底下的include文件夾?
/usr/lib
/usr/local/lib
/lib
?
?
4、使用外部庫【-i選項】
//例程 #include <math.h> #include <stdio.h>int main() {double ans = pow(2.0,3.0);printf("pow(%lf,%lf) = %lf\n",2.0,3.0,ans);return 0; }
編譯:
gcc?-Wall?calc.c?-o?calc?-lm
#-lm表示要鏈接libm.so或者libm.a庫文件
?
靜態(tài)庫與共享庫
1、概要
靜態(tài)庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執(zhí)行文件中。程序運行的時候將不再需要靜態(tài)庫,靜態(tài)庫占用磁盤空間較大。
共享庫(.so/.sa):程序在運行的時候才去鏈接共享庫的代碼,多個程序可共享使用庫的代碼。[最近的Linux[CentOS?6.4]版本在/usr以及/lib目錄下已經(jīng)找不到.a文件的蹤影了]
?
?
2、共享庫的優(yōu)點:
一個與共享庫鏈接的可執(zhí)行文件僅僅包含它用到的函數(shù)入口地址的一個表,而不是外部函數(shù)所在目標文件的整個機器碼
在可執(zhí)行文件開始運行以前,外部函數(shù)的機器碼由操作系統(tǒng)從磁盤上的該共享庫中復制到內存中,這個過程稱為動態(tài)鏈接(dynamic?linking)
共享庫可以在多個程序間共享,所以動態(tài)鏈接使得可執(zhí)行文件更小,節(jié)省了磁盤空間。操作系統(tǒng)采用虛擬內存機制允許物理內存中的一份共享庫被要用到該庫的所有進程共用,節(jié)省了內存和磁盤空間。
生成靜態(tài)庫
-可以簡單的認為將多個.o文件打包到一起,就生成了靜態(tài)庫
?
1)gcc?-c?hello_fn.c
#同gcc?-Wall?-c?hello_fn.c?-o?hello_fn.o
2)ar?rcs?libhello.a?hello_fn.o?search.o
#arar是gnu歸檔工具,rcs表示(replace?and?create),相當于將將.o文件打包成為.a文件,并且.o文件可以有多個
?
3)gcc?-Wall?main.c?libhello.a?-o?main
#將各個模塊編譯,鏈接生成可執(zhí)行文件【方式一】
4)gcc?-Wall?-L.?main.c?-o?main?-lhello
#-L.表示在當前目錄搜索庫文件,-lhello[省略的lib],此時即使刪除靜態(tài)庫libhello.a也可運行main文件【方式二】
?
庫的搜索路徑
1)從左到右搜索-I?-L指定的目錄。
2)由環(huán)境變量指定的目錄
可以定義C_INCLUDE_PATH/CPP_INCLUDE_PATH(頭文件搜索路徑)、LIBRARY_PATH(庫文件搜索路徑)保存在~/.bash_profile中,另在Ubuntu系統(tǒng)中,也可以將這些定義存放在~/.bashrc中
?
3)由系統(tǒng)指定的目錄:/usr/include,/usr/lib等
?
生成共享庫
gcc?-shared?-fPIC?hello_fn.o?-o?hello_fn.so
?
說明:
1)shared表示生成共享庫
2)-fPIC表示生成位置無關碼(Position?Independent?Code)
3)庫的命名規(guī)則:libXXX.so[.版本號]
?
?
使用共享庫
1)gcc?main.o?-o?main?–L.?-lhello
#該命令與使用靜態(tài)庫的命令相同,但是,在共享庫與靜態(tài)庫共存的情況下,優(yōu)先使用共享庫
l:鏈接共享庫,只要庫名即可(去掉lib以及版本號)
L:鏈接庫所在的路徑.
?
2)運行共享庫
法1)拷貝.so文件到系統(tǒng)共享庫路徑下,一般指/usr/lib
法2)在~/.bash_profile文件中,配置LD_LIBRARY_PATH變量
export?LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
.?~/.bash_profile
?
法3)配置/etc/ld.so.conf,配置完成后調用ldconfig更新ld.so.cache
?
3)ldd命令:用于查看程序運行時需要加載的共享庫
?
總結
以上是生活随笔為你收集整理的gcc学习(二)[第二版]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 润乾报表与DERBY数据库的创建连接详解
- 下一篇: 删除静态 IP 路由