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