1. 程式人生 > >Linux 動態庫剖析 and Linux動態連結庫程式設計入門

Linux 動態庫剖析 and Linux動態連結庫程式設計入門

下面通過一個簡單的例子開始介紹Linux標準物件。

我們的標準物件檔案含有一個函式,不需要宣告export匯出符號,只需要編譯器設定即可。如下:
設建立一個tools.h檔案以及tools.c檔案
/*
** tools.h
*/
#include "stdio.h"
#include "stdlib.h"
void draw();
void write();
void sign();
void show();

/*
**tools.c
*/
#include "tools.h"
void draw()
{
printf("draw some graphics./n");
}
void write()
{
printf("write some characters./n");
}
void sign()
{
printf("sign your name./n");
}
void show()
{
printf("A picture by xufeng./n");
draw();
write();
printf("A picture is finished./n");
}

按照如下編譯:

$ gcc -fPIC -shared -o libmytools.so tools.c

執行生成一個libmytools.so檔案,按照Linux標準物件的命名慣例,應該在庫名稱之前加上"lib"字首,儘管不是必須的。編譯開關-fPIC代表函式符號可以重定向,-shared代表編譯結果是一個標準物件。

不同於Win32DLL,Linux標準物件中的所有函式都是直接匯出的,都可以被呼叫程式所訪問。下面我們編寫呼叫程式:

/*
** test.c
*/
#include "tools.h"
main()
{
show();
printf("success!/n");
}
按照如下gcc編譯:

$ gcc -o test test.c ./libmytools.so

編譯生成test可執行檔案。如上編譯條件的最後一條需要是所呼叫的標準物件檔名,注意必須含有路徑。如果只是使用libmyso.so,則必須確保這個檔案在可訪問的PATH下面。本例所使用的檔名"./libmytools.so"是當前路徑下的,使用了相對路徑。

如下測試結果:

$ ./test
A picture by xufeng.
draw some graphics.
write some characters.
A picture is finished.
success!


gcc編譯的一些引數問題:
-I include的查詢路徑,也就是標頭檔案在位置
-L 庫檔案的查詢路徑,如 gcc -o test test.c -L./mylib libmytools.so
意思是說增加./mylib到庫檔案的搜尋路徑中,此時libmytools.so不能簡寫mytools
-l 庫檔案,如-lmytools 代表在PATH下面去找libmytools.so,此時必須簡寫成mytools,否則出錯。
如 gcc -o test test.c -lmytools
也可以指定庫檔案到位置,如 gcc -o test test.c ./libmytools.so 是一樣的,不過最好將庫檔案拷貝到/lib或/usr/lib下面