看板 NCTU_CS_EDA 關於我們 聯絡資訊
如果有想要建立自己的 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
dnol:實用! 太感謝了! 這篇應該要收精華區 02/10 00:23