so_test.h:
#include
#include
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_a.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
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 將test.c與動態庫libtest.so鏈接生成執行文件test:
$ gcc test.c -L. -ltest -o test
l 測試是否動態連接,如果列出libtest.so,那麼應該是連接正常了
$ ldd test
最主要的是GCC命令行的一個選項:
-shared
該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標誌外部程序無法連接。相當於一個可執行文件
l
-fPIC:表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真
正代碼段共享的目的。
l -L.:表示要連接的庫在當前目錄中
l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱
l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
最後. 輸出庫的路徑,或者拷貝到/lib目錄下
export LD_LIBRARY_PATH=. // 老婆大人告訴俺的
執行 ./test
搞定
靜態:
先編譯成.o
gcc -c test_a.c test_b.c test_c.c
然後用ar命令
ar -r libtest.a test_a.o test_b.o test_c.o