1. 程式人生 > >嵌入式動靜態庫生成與使用

嵌入式動靜態庫生成與使用

寫一個C語言程式碼,實現三個整數的求平均數和求和操作,main函式中包含對求平均數和求和函式的呼叫,求平均數和求和函式分別放置在和main函式不同的檔案中。
1. 在宿主機客戶端輸入命令:gedit 原始檔名.c ,在開啟的檔案中編寫C程式原始碼。
2. 使用arm-linux-gcc編譯器編譯源程式
3. 將求平均數和求和函式生成支援6410開發板的靜態庫
4. 使用靜態庫生成可執行檔案,並在開發板上執行
5. 將求平均數和求和函式生成支援6410開發板的動態庫
6. 使用動態庫生成可執行檔案,並在開發板上執行
7. 在開發板上執行程式,命令如下:./目標檔名

多檔案實現三個整數的平均數和求和的操作。
main.c

//main.c
#include <stdio.h>
#include "a.h"
int main()
{
    int a,b,c;
    float avg;
    int sum;
    printf("請輸入三個整數,以空格隔開:\n");
    scanf("%d %d %d",&a,&b,&c);
    avg=myavg(a,b,c);   
    printf("the average is: %5.2f\n",avg);
    sum=mysum(a,b,c);
    printf("the sum is:%d\n",sum);
    return
0; }

mysum.c

//mysum.c
int mysum(int a,int b,int c)
{
     return a + b + c;
}

myavg.c

//myavg.c
float myavg(int a,int b,int c){
    float avg;
    avg=(float)(a+b+c)/3;
    return avg;
}       

a.h

//a.h
float myavg(int a,int b,int c);  
int mysum(int a,int b,int c);

在linux下
常規編譯gcc mysum.c -o mysum.o -c
~ gcc myavg.c -o myavg.o -c
~gcc main.c -o main.o -c
或者gcc *.c -c 將資料夾中所有的.c檔案變為.o檔案

靜態編譯ar
~ar -rv libtest.a myavg.o mysum.o
~gcc main.c -o main -L ./ -ltest
~./main

動態編譯
~gcc myavg.o mysum.o -o libtt.so -shared
~vim ~/.bashrc
~gcc main.c -o main2 -L ./-ltt
~./main

——————————————靜態編譯——————————————

  • ~gcc mysum.c myavg.c -c 將檔案變為 .o檔案
  • 首先ar -r libtest.a myavg.o mysum.o (將myavg.o mysum.o 歸檔到libtest.a中生成靜態庫檔案)
  • 然後看ar -t libtest.a 進行『檢視』是否成功存在myavg.o mysum.o
  • 然後gcc main .c -o main -L ./ -ltest 進行連線形成可執行檔案main
  • ./main 如下圖顯示

靜態編譯

———————————————動態編譯—————————————–

  • ~gcc mysum.c myavg.c -c 將檔案變為 .o檔案
  • 首先gcc myavg.o mysum.o -o libtest.so -shared;(生成libtest.so動態庫)
  • 然後用vim ~/.bashrc 中修改環境變數export LD_LIBRARY_PATH=./:$ LD_LIBRARY_PATH (./指當前路徑,通常是庫檔案所在路徑)
  • 然後進行source ~/.bashrc

動態編譯

結論:
將執行檔案放到其他的資料夾中發現
靜態所得到的main 執行檔案可以執行
動態所得到的main2執行檔案不能執行

  1. 動態編譯的可執行檔案需要附帶一個的動態連結庫,在執行時,需要呼叫其對應動態連結庫中的命令。所以其優點一方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,只用到了連結庫中的一兩條命令,也需要附帶一個相對龐大的連結庫;二是如果其他計算機上沒有安裝對應的執行庫,則用動態編譯的可執行檔案就不能執行。
     
  2. 靜態編譯就是編譯器在編譯可執行檔案的時候,將可執行檔案需要呼叫的對應動態連結庫(.so)中的部分提取出來,連結到可執行檔案中去,使可執行檔案在執行的時候不依賴於動態連結庫。所以其優缺點與動態編譯的可執行檔案正好互補。