Linux library筆記

這文章是static library的筆記,首先我們先寫兩個簡單的function當library要用的。
#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

留言

這個網誌中的熱門文章

Raspberry Pi (ARMv6)上自幹一個微小作業系統

Linux VLAN 筆記

C語言,大數運算,階層筆記