Linux library筆記
這文章是static library的筆記,首先我們先寫兩個簡單的function當library要用的。
$ gcc lucy.c /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld returned 1 exit status
所以要加這個參數 -c Compile and assemble, but do not link
$ gcc -c bill.c lucy.c
$ ls
bill.c bill.o lucy.c lucy.o
$ gcc -o go carlos.c bill.o lucy.o
$ ./go lucy say+1:12
這樣一來calros.c 就可以連接到lucy.o的function.
接下來我們來試著產生static的library *.a檔。
我把lib名稱取叫ks
$ ar crv libks.a bill.o lucy.o a - bill.o a - lucy.o
$ ls bill.c bill.o carlos.c go libks.a lucy.c lucy.o mylib.h
$ gcc -o go carlos.c -L. -lks
-L是指定libraray的位置。 .的意思是在目前的目錄下找lib,-lks是要找名稱為libks的函式庫。 也可以使用ranlib放到標準目錄下
$ ./go lucy say+1:12
可以使用nm這指令來看object file有含哪些function.
$ nm libks.a
bill.o:
00000000 T bill
U printf
lucy.o:
00000000 T lucy
U printf
使用nm去看carlos.c的話只會看到含lucy的function,因為linker只會加入,真正有用到的function。
使用ldd來查看程式需要哪些share library最後面的數字是版本號。
$ ldd go
linux-gate.so.1 => (0x00821000)
libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x00439000)
/lib/ld-linux.so.2 (0x0041a000)
static library的缺點是,每個程式在都使用同一個function時,發生相同的function程式碼,佔用記憶體的問題,使用shared library,程式會在被執行(載入記憶體時),才去連接載入相關function.
如何產生shared library可以參考下面的網頁
http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
實務上我們會用Makefile來完成這些動作,這篇是基礎的教學。
reference: http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470147628.html
#include <stdio.h> void bill(char arg) { printf("Bill say:%s \n",arg); } #include <stdio.h> void lucy(int arg) { printf("lucy say+1:%d\n",(arg+1)); }因為沒有main function是不能編成執行檔的。
$ gcc lucy.c /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld returned 1 exit status
所以要加這個參數 -c Compile and assemble, but do not link
$ gcc -c bill.c lucy.c
$ ls
bill.c bill.o lucy.c lucy.o
#include <stdio.h> #include <stdlib.h> #include "mylib.h" int main() { lucy(11); exit(0); }編釋寫好的測式程式。
$ gcc -o go carlos.c bill.o lucy.o
$ ./go lucy say+1:12
這樣一來calros.c 就可以連接到lucy.o的function.
接下來我們來試著產生static的library *.a檔。
我把lib名稱取叫ks
$ ar crv libks.a bill.o lucy.o a - bill.o a - lucy.o
$ ls bill.c bill.o carlos.c go libks.a lucy.c lucy.o mylib.h
$ gcc -o go carlos.c -L. -lks
-L是指定libraray的位置。 .的意思是在目前的目錄下找lib,-lks是要找名稱為libks的函式庫。 也可以使用ranlib放到標準目錄下
$ ./go lucy say+1:12
可以使用nm這指令來看object file有含哪些function.
$ nm libks.a
bill.o:
00000000 T bill
U printf
lucy.o:
00000000 T lucy
U printf
使用nm去看carlos.c的話只會看到含lucy的function,因為linker只會加入,真正有用到的function。
使用ldd來查看程式需要哪些share library最後面的數字是版本號。
$ ldd go
linux-gate.so.1 => (0x00821000)
libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x00439000)
/lib/ld-linux.so.2 (0x0041a000)
static library的缺點是,每個程式在都使用同一個function時,發生相同的function程式碼,佔用記憶體的問題,使用shared library,程式會在被執行(載入記憶體時),才去連接載入相關function.
如何產生shared library可以參考下面的網頁
http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
實務上我們會用Makefile來完成這些動作,這篇是基礎的教學。
reference: http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470147628.html
留言