推 dnol:實用! 太感謝了! 這篇應該要收精華區 02/10 00:23
如果有想要建立自己的 share library 的話可以參考一下
作者 float (鵬羽) 站內 P-float
標題 建立 動態、靜態函式庫
時間 2011/11/10 Thu 16:43:27
reference:http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch09.htm
reference裡面比較詳細
簡介:
函式庫(library)是一些事先編譯過的函數集合
Linux中標準的系統函數庫通常放在目錄/lib和/usr/lib,函式庫的名稱都是以lib開頭,
再加上自定的名稱,附屬檔名為.a或.so。名稱加上.a的函式庫代表這是一個靜態的函式
庫,名稱加上.so的函式庫代表這是一個動態的函式庫。
靜態函式庫 libXXXX.a
動態函式庫 libXXXX.so
特性
靜態函式庫:執行時不需要函式庫,但檔案較大
動態函式庫:執行檔小
更改程式可以不用重新編譯其他程式
甚至可以在執行時修改
動態函式庫命名
real name: libXXXX.so.版本代號1.版本代號2....
linker name: 編譯器所搜尋的程式庫名稱,
傳統上就是real name刪去所有版本號碼後的名稱,
例如「libXXXX.so」
使用函式庫
拿數學函式庫舉例我們在使用的時候會下像這樣的指令
gcc main.c -o main -lm
-lm 就是告訴linker我們要link m這個函式庫
而m這個函式庫的實際檔案名稱是 libm.a (靜態)
接下來用下面三個檔案來示範製作動態和靜態函式庫
==========main.c==========
#include "my_lib.h"
int main()
{
my_printf("abc");
return 0;
}
==========================
==========my_lib.h========
#ifndef __MY_LIB_H__
#define __MY_LIB_H__
#include <stdio.h>
int my_printf(const char* str);
#endif
==========================
==========my_lib.c========
#include "my_lib.h"
int my_printf(const char* str)
{
return printf(str);
}
==========================
以上當案可以先用
gcc main.c my_lib.c -o main 編譯來測試正確性
接下來第一步將要編成函式庫的檔案編譯但不要link
gcc -c my_lib.c
-c 參數就是編譯但不連結
執行完後會產生 my_lib.o
這時候一樣可以這樣編譯
gcc main.c my_lib.o -o main
如果懶得繼續把檔案編成什麼函式庫是可以這樣用就好XD
靜態函式庫
接下來使用ar指令來產生靜態函式庫
ar -cru libmy_lib.a my_lib.o
其中參數-cru 用來建立或加入目的檔案,c建立靜態函數庫,r告知ar取代已經存在的目
的檔案,u表示取代的目的檔案必須比現存的目的檔案還新。
這樣就可以產出 libmy_lib.a 這個靜態函式庫
接下來就可以這樣使用編譯好的函式庫
gcc main.c -o main -lmy_lib (視情況加上 -L函式庫位置讓編譯器搜尋的到函式庫)
執行 ./main
動態函式庫
第一步也是將要編成函式庫的檔案編譯
gcc -fPIC -c my_lib.c 一樣產生my_lib.o
加上fPIC的用意好像是讓他在記憶體中只有一份可以省空間,這我還要研究一下
不加也是可以完成後面的步驟
在來使用-shared來讓gcc建立動態函式庫
gcc -shared my_lib.o -o libmy_lib.so
就可得到 libmy_lib.so 這個動態函式庫
在來使用方法同上
gcc main.c -o main -lmy_lib (視情況加上 -L函式庫位置讓編譯器搜尋的到函式庫)
這時候執行./main應該會發現類似以下錯誤
./main: error while loading shared libraries: libmy_lib.so: cannot open
shared object file: No such file or directory
這是因為 libmy_lib.so 並不是放在PATH所包含的路徑下,
把它搬過去或是在PATH裡面加入你想要的位置就可以解決這個問題了
以上 請多指教
還有我發現那個網頁好像很多地方打錯字= =
==補充==
剛剛自己在實做的時候想到一個問題,如果目錄下同時有動態和靜態函式庫那要gcc會選
哪個? 答案是先選動態,如果希望使用靜態的函式庫請加上 -static 參數
--
╔═══╗ ╦ ╔═══╗ ╔═══╗ ╔═╦═╗
║ ║ ║ ║ ║ ║ ║
╠══╣ ║ ║ ║ ╠═══╣ ║
║ ║ ║ ║ ║ ║ ║
╩ ╩═══╝ ╚═══╝ ╩ ╩ ╩
--
※ Origin: 成功大學資訊工程學系[醉資心BBS] <goodguy.csie.ncku.edu.tw>
◆ From: 140.116.111.93
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.134.61