1. 程式人生 > >交叉編譯自己的動態庫

交叉編譯自己的動態庫

(1)將testa.c testb.c 編譯成動態庫 libtest.so

testa.c:

#include <stdio.h>

void print_a(void)
{
 printf("this is test_a\n");
}

testb.c:

#include <stdio.h>

void print_b(void)
{
 printf("this is test_b\n");
}

編譯:

$ gcc testa.c testb.c  -fPIC -shared -o libtest.so

編譯引數:

          -shared 該選項指定生成動態連線庫(讓聯結器生成T型別的匯出符號表,有時候也生成弱連線W型別的匯出符號),不用該標誌外部程式無法連線。相當於一個可執行檔案
          -fPIC:表示編譯為位置獨立的程式碼,不用此選項的話編譯後的程式碼是位置相關的所以動態載入時是通過程式碼拷貝的方式來滿足不同程序的需要,而不能達到真正程式碼段共享的目的。
          -L:表示要連線的庫所在目錄
          -l:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

(2)如果將編譯的庫放在/lib下即可直接使用,如果在自己的目錄下需要輸出LD_LIBRARY_PATH環境變數,以便動態庫裝載器能夠找到需要的動態庫:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/decly/lib              (指定庫的目錄,必須為絕對路徑)

(3) 編譯應用程式

test.h:

#ifndef TEST_H
#define TEST_H

void print_a(void);
void print_b(void);

#endif

test.c:

#include <stdio.h>
#include "test.h"

int main(void)
{
 print_a();
 print_b();
 return 0;
}


編譯:

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

之後檢視連線庫是否成功 $ldd test

交叉編譯步驟一致:

(1)  $arm-linux-gcc testa.c testb.c -fPIC -shared -o libtest.so

(2)  $arm-linux-gcc test.c -L. -ltest -o test

需要將 libtest.so 下載到開發板 /lib 下