一、linux操作系統支持的函數庫分支
靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程序
優點:程序的運行環境中不需要外部的函數庫
缺點:可執行程序大
動態庫:又稱共享庫,libxxx.so,在程序運行時將庫加載到可執行程序中
優點:可執行程序小
缺點:程序的運行環境中必須提供相應的庫
函數庫目錄:/lib /usr/lib
二、靜態庫的制作
① 生成目標文件:gcc -c file.c
② 靜態庫的創建命令 ar
ar -cr libfile.a file.o
-c:Crete的意思
-r:replace的意思,表示當插入的模塊file.o已經存在libfile.a中,則覆蓋。反之ar顯示一個錯誤信息。
③ 操作靜態庫的幾個實例:
情況1:如果從別處得到一個靜態庫libunknown.a,想知道其中包含哪些模塊。
命令--- ar -t libunknown.a
靜態庫的編譯:gcc -o main main.c -L. -lfile 編譯main.c 就會把靜態庫整合到main中。
其中:
-L:指定靜態函數庫的位置供查找,注意L后面還有個. ,表示靜態庫在當前目錄查找。
-l:則指定了靜態庫名,由於靜態函數庫的命名方式是lib***.a,其中lib和 .a可以忽略不寫。
④ 示例
三、動態庫的制作
① 生成目標文件:gcc -c file.c
② gcc -shared -fpic -o libfile.so file.o
-fpic:產生位置無關代碼
-shared:生成共享庫
用上述命令生成libfile.so動態函數庫。
gcc -o out main.c -L. -lfile
此時還不能立即執行./out ,因為在動態函數庫使用時,會默認在 /usr/lib或 /lib目錄下去查找動態庫,而此時我們生成的庫不在里面
③ 示例
第一種方法:
libfile.so方到 /lib 或 /usr/lib中去
第二中方法: 環境變量的方法,假設libsub.so在~/Coding/libsotest
執行 export LD_LIBRARY_PATH=~/Coding/libsotest
echo $LD_LIBRARY_PATH 查看路徑是否添加成功
第三種方法:修改sheel配置腳本
在/etc/ld.so.conf文件里加入我們生成的庫目錄,然后/sbin/ldconfig
/etc/ld.so.conf是一個非常重要的目錄,里面存放的是鏈接器和加載器搜索共享庫時要檢查的目錄,默認是從/usr/lib
或/lib 中讀取,所以想要順利運行,可以把我們庫的目錄加入到這個文件中並執行/sbin/ldconfig
① 打開ld.so.conf文件
② 向文件中添加路徑
③ 用ldconfig執行sheel腳本
④ 執行可執行程序
四、靜態庫和動態庫的大小比較
由此可見:
編譯成功后可執行程序,靜態庫比較大,因為這里代碼不多,所以看不到有很大差距
http://www.cnblogs.com/jiangson/p/6077171.html