gcc学习(二)[第二版]
頭文件與庫文件
1、概要
在使用C語言和其他語言進行程序設計的時候,我們需要頭文件來提供對常數的定義和對系統及庫函數調用的聲明。
庫文件是一些預先編譯好的函數集合,那些函數都是按照可重用原則編寫的。它們通常由一組互相關聯的用來完成某項常見工作的函數構成。比如用來處理屏幕顯示情況的函數(ncurses庫)和數據庫訪問例程(dbm庫)等。
?
2、使用庫的優點:
1)模塊化開發
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庫文件
?
靜態庫與共享庫
1、概要
靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。程序運行的時候將不再需要靜態庫,靜態庫占用磁盤空間較大。
共享庫(.so/.sa):程序在運行的時候才去鏈接共享庫的代碼,多個程序可共享使用庫的代碼。[最近的Linux[CentOS?6.4]版本在/usr以及/lib目錄下已經找不到.a文件的蹤影了]
?
?
2、共享庫的優點:
一個與共享庫鏈接的可執行文件僅僅包含它用到的函數入口地址的一個表,而不是外部函數所在目標文件的整個機器碼
在可執行文件開始運行以前,外部函數的機器碼由操作系統從磁盤上的該共享庫中復制到內存中,這個過程稱為動態鏈接(dynamic?linking)
共享庫可以在多個程序間共享,所以動態鏈接使得可執行文件更小,節省了磁盤空間。操作系統采用虛擬內存機制允許物理內存中的一份共享庫被要用到該庫的所有進程共用,節省了內存和磁盤空間。
生成靜態庫
-可以簡單的認為將多個.o文件打包到一起,就生成了靜態庫
?
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
#將各個模塊編譯,鏈接生成可執行文件【方式一】
4)gcc?-Wall?-L.?main.c?-o?main?-lhello
#-L.表示在當前目錄搜索庫文件,-lhello[省略的lib],此時即使刪除靜態庫libhello.a也可運行main文件【方式二】
?
庫的搜索路徑
1)從左到右搜索-I?-L指定的目錄。
2)由環境變量指定的目錄
可以定義C_INCLUDE_PATH/CPP_INCLUDE_PATH(頭文件搜索路徑)、LIBRARY_PATH(庫文件搜索路徑)保存在~/.bash_profile中,另在Ubuntu系統中,也可以將這些定義存放在~/.bashrc中
?
3)由系統指定的目錄:/usr/include,/usr/lib等
?
生成共享庫
gcc?-shared?-fPIC?hello_fn.o?-o?hello_fn.so
?
說明:
1)shared表示生成共享庫
2)-fPIC表示生成位置無關碼(Position?Independent?Code)
3)庫的命名規則:libXXX.so[.版本號]
?
?
使用共享庫
1)gcc?main.o?-o?main?–L.?-lhello
#該命令與使用靜態庫的命令相同,但是,在共享庫與靜態庫共存的情況下,優先使用共享庫
l:鏈接共享庫,只要庫名即可(去掉lib以及版本號)
L:鏈接庫所在的路徑.
?
2)運行共享庫
法1)拷貝.so文件到系統共享庫路徑下,一般指/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数据库的创建连接详解
- 下一篇: PL/SQL复合数据类型