1. 程式人生 > >動態庫*.so製作-linux 巢狀動態庫

動態庫*.so製作-linux 巢狀動態庫

http://blog.csdn.net/cy_cai/article/details/9959511

在linux下製作動態庫*.so。

1、linux下動態庫的製作

//so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();

//test_a.c
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}

//test_b.c
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}

//test_c.c
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");

}

生成動態庫:libtest.so
gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、動態庫與標頭檔案位置

# cp  libtest.so  /lib/

# cp  so_test.h   /usr/include/

3、動態庫的連結

測試程式


//test.c
#include <so_test.h>
int main()
{
test_a();
test_b();
test_c();
return 0;

}

將test.c與動態庫libtest.so連結生成執行檔案test:

 gcc test.c -L. -ltest -o test

測試是否動態連線,如果列出libtest.so,那麼應該是連線正常了

 ldd test

4、巢狀動態庫

//d.h

#inlcude<so_test.h>

void test_d();

//test_d.c

#include<d.h>

int main()

{

 test_a();

 test_b();

 test_c();

}

生成二次封裝的庫

gcc test_d.c -fPIC -shared -I. -L. -ltest  -o libtest2.so

//注意原始檔的位置,還需要制定include的位置

編寫二次封裝測試檔案:

//test2.c

#include<d.h>

int main()

{

 test_d();

 return 0;

}

gcc test2.c -I. -L. -ltest2 -o test2




5、編譯引數解析


-shared

該選項指定生成動態連線庫(讓聯結器生成T型別的匯出符號表,有時候也生成弱連線W型別的匯出符號);

不用該標誌外部程式無法連線,相當於一個可執行檔案;


-fPIC

表示編譯為位置獨立的程式碼;

不用此選項的話編譯後的程式碼是位置相關的所以動態載入時是通過程式碼拷貝的方式來滿足不同程序的需要,而不能達到真正程式碼段共享的目的;


-L.

表示要連線的庫當前目錄


-ltest

編譯器查詢動態連線庫時---隱含的命名規則[註釋:libtest.so  ==  -ltest  /  libhello.so ==  -lhello ]


LD_LIBRARY_PATH

這個環境變數指示動態聯結器可以裝載動態庫路徑

修改/etc/ld.so.conf檔案,然後呼叫 /sbin/ldconfig來達到同樣的目的,不過如果沒有root許可權,那麼只能採用輸出LD_LIBRARY_PATH的方法了。