下面以工程libtest爲例說明gcc建立和使用靜態庫、動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個文件hello.h,hello.c和main.c的內容以下。bash
圖1spa
libtest/include/hello.h
.net
#ifdef _HELLO_H_ #define _HELLO_H_ void hello(); #endif
libtest/lib/hello.c code
#include "hello.h" #include <stdio.h> void hello() { printf("hello world!\n"); }
libtest/src/main.c blog
#include "hello.h" int main() { hello(); }
(1) 進入libtest/lib目錄,執行命令:get
gcc -c -I../include hello.c博客
該命令生成目標文件hello.o,注意:參數-I添加頭文件搜索目錄,這裏由於hello.c中有#include 「hello.h」,hello.h在libtest/include目錄中,這裏須要指定該目錄通知gcc,不然出現錯誤提示「找不到頭文件hello.h」。io
這一步將在libtest/lib目錄中生成一個hello.o文件。編譯
(2) 在libtest/lib目錄,執行命令:class
ar rc libhello.ahello.o
該命令將hello.o添加到靜態庫文件libhello.a,ar命令就是用來建立、修改庫的,也能夠從庫中提出單個模塊,參數r表示在庫中插入或者替換模塊,c表示建立一個庫,關於ar命令的詳細使用規則能夠參考文章http://blog.csdn.net/xuhongning/article/details/6365200。
這一步將在libtest/lib目錄中生成一個libhello.a文件。
(3) 進入libtest/src目錄,執行命令:
gcc main.c-I../include -L../lib -lhello -o main
該命令將編譯main.c並連接靜態庫文件libhello.a生成可執行文件main,注意:參數-L添加庫文件搜索目錄,由於libhello.a在libtest/lib目錄中,這裏須要指定該目錄通知gcc,參數-l指定連接的庫文件名稱,名稱不用寫全名libhello.a,只用寫hello便可。
這一步將在libtest/src目錄中生成可執行文件main。
(1) 進入libtest/lib目錄,執行命令:
gcc hello.c-I../include -fPIC -shared -o libhello.so
這一步將在當前目錄生成動態庫文件libhello.so,參數-fPIC -shared固定格式,不用糾結他們什麼意思。
(2) 進入libtest/src目錄,執行命令:
gcc main.c-I../include -L../lib -lhello -o main
此時在當前目錄中已經生成了可執行文件main,執行./main時卻提示錯誤:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory
也就是找不到動態庫文件libhello.so,在網上找了答案說若是遇到這樣的問題須要設置環境變量LD_LIBRARY_PATH,以下:
export LD_LIBRARY_PATH=」../lib」
gcc main.c -I../include -L../lib -lhello -o main
而後再執行./main就沒有錯誤了。
【補充】
環境變量LD_LIBRARY_PATH指示動態鏈接器能夠裝載動態庫的路徑,在連接動態庫文件前設置該變量爲庫文件所在路徑,注意:用export LD_LIBRARY_PATH=」…」方式只是臨時生效的,若是要永久有效能夠寫入~/.bashrc文件中,跟修改PATH相似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:」…」。
固然若是有root權限的話,也能夠修改/etc/ld.so.conf文件,將要添加的動態庫搜索路徑寫入該文件中,而後調用/sbin/ldconfig來達到一樣的目的。
本博客還有另一篇文章可參考:http://blog.csdn.net/lewsn2008/article/details/8261062